我希望在我的用户的帮助下对某些受某些规则保护的数据进行休息调用,因此我需要将令牌发送给我的请求。 根据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):
使用访问令牌 Database REST API将在查询字符串或标头Authenticate:Bearer上接受access_token =以使用服务帐户验证请求。
'https://samplechat.firebaseio-demo.com/users/jack/name.json?access_token=<TOKEN>'
即使我在设置时使用了新的firebase控制台,即使我使用的令牌是使用新的Firebase sdk生成的,新的方式也不适用于我。有人知道为什么只有弃用的方式有效吗?我有兴趣将令牌放在我的请求的标题中但不能这样做。
答案 0 :(得分:2)
对于java: 我尝试使用 auth 来访问DatabaseRealtime。 运行:
curl 'https://PROJECT_ID.firebaseio.com/users.json?auth=DATABASE_SECRET'
它有效,但这种方式已弃用。
之后我尝试使用 access_token
使用 access_token 在我的firebase项目中查询数据库时遇到了问题。
我已经找到了我之前遇到的错误的根本原因。 因为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
答案 1 :(得分:1)
您需要将access_token放在标题中。
标题名称:授权
标头内容:持票人 the_token
要尝试并添加一些标题,您可以使用一些工具,例如postman for google chrome或其他工具。
答案 2 :(得分:0)
像这样:
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是您可以在帐户中生成的服务管理员帐户信息
答案 3 :(得分:-1)
我遇到了同样的问题。仅在Authorization标头中添加令牌不起作用,但在请求中包含'auth ='的旧方法有效。我认为这可能是Firebase中的一个错误。
我的解决方案是同时使用新方式和旧方法,即在请求中包含'auth =',以及在Authorization标头中包含令牌。因此,在他们解决问题后,您的应用将继续有效。
顺便说一下那些关于规则的答案是不正确的,如果问题是由规则引起的,那么错误将是401未经授权而不是403并且消息'权限被拒绝'
答案 4 :(得分:-2)