如何在 Firebase 中验证休息呼叫?
Posted
技术标签:
【中文标题】如何在 Firebase 中验证休息呼叫?【英文标题】:How do i authenticate a rest call in firebase? 【发布时间】:2016-10-01 22:22:56 【问题描述】:我想在我的用户的帮助下对一些受某些规则保护的数据进行休息调用,所以我需要获得我的请求的令牌。 根据哪个版本的 firebase 文档,有不同的方法: 旧的和过时的方式(https://www.firebase.com/docs/rest/api/):
'https://samplechat.firebaseio-demo.com/users/jack/name.json?auth=<TOKEN>'
新方法,我引用文档(https://firebase.google.com/docs/reference/rest/database/user-auth#section-get):
使用访问令牌 数据库 REST API 将接受查询字符串或标头上的 access_token= Authenticate: Bearer 以使用服务帐户对请求进行身份验证。
'https://samplechat.firebaseio-demo.com/users/jack/name.json?access_token=<TOKEN>'
即使我在设置时使用了新的 Firebase 控制台,即使我使用的令牌是使用新的 Firebase sdk 生成的,新方法也不适合我。有人知道为什么只有不推荐使用的方式有效吗?我有兴趣将令牌放在请求的标头中,但不能这样做。
【问题讨论】:
如果我在下面的回复不起作用,您能否提供您收到的错误消息? 有人有这个工作吗?我已使用 github 示例 link 生成令牌并从自定义登录页面使用它登录。该示例工作正常。但是,当我通过 curl 或邮递员(即授权标头 - 承载令牌)使用生成的访问令牌(即 customauth.html 的“accessToken”结果)时,我得到权限被拒绝(403) 错误信息总是一样的:403 (Forbidden) "error": "Permission denied." access_token 对我有用....通过 Okhttp 添加标头对我不起作用......虽然当我使用 REST 客户端时工作......但不知道为什么 【参考方案1】:对于java: 我尝试使用 auth 来访问 DatabaseRealtime。 运行:
curl 'https://PROJECT_ID.firebaseio.com/users.json?auth=DATABASE_SECRET'
它有效,但这种方式已被弃用。 之后我尝试使用 access_token 在我的 firebase 项目中使用 access_token 查询数据库时遇到了问题。 我已经找到了之前遇到的错误的根本原因。 因为access_token生成错误。我尝试再次生成access_token,尝试使用access_token如下:
1.将 google-api-client 添加到 pom.xml
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.22.0</version>
</dependency>
2。获取令牌
public static void main(String[] args) throws Exception GoogleCredential googleCred = GoogleCredential.fromStream(new FileInputStream("C://realtime.json")); GoogleCredential scoped = googleCred.createScoped( Arrays.asList( // or use firebase.database.readonly for read-only access "https://www.googleapis.com/auth/firebase.database", "https://www.googleapis.com/auth/userinfo.email" ) ); scoped.refreshToken(); String token = scoped.getAccessToken(); System.out.println(token);
3.尝试访问数据库 复制上面打印出来的值 运行 curl:
curl 'https://PROJECT_ID.firebaseio.com/users.json?access_token=TOKEN'
效果很好。
更多信息请参考链接:https://firebase.google.com/docs/reference/rest/database/user-auth#section-get
【讨论】:
【参考方案2】:像这样:
try (InputStream is = new ClassPathResource("your-admin-info.json").getInputStream())
GoogleCredential googleCred = GoogleCredential.fromStream(is);
scoped = googleCred.createScoped(
Arrays.asList(
"https://www.googleapis.com/auth/firebase.database",
"https://www.googleapis.com/auth/userinfo.email"
)
);
scoped.refreshToken();
scoped.getAccessToken();
your-admin-info.json 是您可以在您的帐户上生成的服务管理员帐户信息
【讨论】:
如果我不使用 Java 怎么办?我只想将数据从我的服务器发送到 firebase。【参考方案3】:我遇到了同样的问题。仅在 Authorization 标头中添加令牌不起作用,但在请求中包含 'auth=' 的旧方法有效。我认为这可能是 Firebase 中的一个错误。
我的解决方案是同时使用新方法和旧方法,即在请求中包含“auth=”以及在授权标头中包含令牌。因此,在他们解决问题后,您的应用将继续运行。
顺便说一句,那些关于规则的答案是不正确的,如果问题是由规则引起的,错误将是 401 未授权而不是 403 消息“权限被拒绝”
【讨论】:
好的,我将答案编辑得更加明显,希望您现在能更容易理解【参考方案4】:您需要检查规则是否配置正确。
有 4 个选项可用于身份验证。
需要为每个选项配置不同的规则。
试试下面的规则:
【讨论】:
问题不在于规则,而在于如何进行身份验证。当我遵循已弃用文档中解释的内容时,我能够进行身份验证,但不是新版本中解释的内容,就像我的问题中解释的那样【参考方案5】:您需要将 access_token 放在标头中。
标头名称:授权
标头内容:不记名the_token
要尝试并放置一些标题,您可以使用一些工具,例如邮递员 for google chrome 或其他工具。
【讨论】:
正如我在问题中所说,我尝试了新的 firebase 文档中所写的内容。所以我尝试了你刚才所说的并重新尝试使用邮递员来确认它。它不适合我。有效的是在已弃用的文档中使用: ?auth=以上是关于如何在 Firebase 中验证休息呼叫?的主要内容,如果未能解决你的问题,请参考以下文章
为啥云函数 URL (Firebase) 可以公开访问?如何限制对特定外部呼叫的访问? [复制]
如何修复错误:在 null 上调用了 getter 'email'。接收者:空尝试呼叫:电子邮件