【问题标题】:Firebase HTTP POST auth argumentFirebase HTTP POST 身份验证参数
【发布时间】:2017-06-09 04:00:38
【问题描述】:

我想直接从 postman 或 curl 使用 Https Rest API 管理我的 Firebase 数据库。例如使用 postman 和 https://MY_FIREBASE_DATABSE_URL/users.json 来返回用户 json。如果我为公共访问设置安全规则

{
"rules": {
".read": true,
".write": true
}

它工作正常。

但是如果我设置需要授权的安全规则

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

我明白了

{"错误", "permission_denied" }

据我了解,我需要使用 auth=SECURITY_TOKEN 附加 https 请求。使用 firebase 控制台中的密钥 - > SECURITY_TOKEN 的服务帐户不起作用,但无论如何它说数据库机密已被弃用。

所以我下载了此处引用的 Java 令牌生成器 https://www.firebase.com/docs/rest/guide/user-auth.html#section-rest-server-authentication

我使用以下代码生成我的令牌

    public void actionPerformed(ActionEvent e) {
    String uid = uidField.getText();
    boolean admin = adminField.isSelected();
    Map<String, Object> authPayload = new HashMap<String, Object>();
    authPayload.put("uid", uid);
    authPayload.put("some", "arbitrary");
    authPayload.put("data", "here");

    TokenOptions tokenOptions = new TokenOptions();
    tokenOptions.setAdmin(admin);

    TokenGenerator tokenGenerator = new TokenGenerator(<MY_DATABASE_SECRET>);
    String token = tokenGenerator.createToken(authPayload, tokenOptions);
    System.out.println(token);
    tokenField.setText(token);
}

如上所述here

其中 MY_DATABASE_SECRET 是来自上述 Firebase 控制台的密钥,而 uid 是来自我的 Firebase 用户的用户 ID。使用这个令牌给邮递员我仍然被拒绝。

【问题讨论】:

  • 您参考的文档适用于旧版 Firebase。您的项目可能是在新的 Firebase 控制台上创建的。您不能混合和匹配版本。有关如何使用新版本的 Firebase 对 REST 调用进行身份验证,请参阅此答案:由 Firebaser Michael Bleigh 撰写的stackoverflow.com/a/37444914/209103
  • 我在那篇文章中不明白(我不能在那里发表评论)是什么意思是“你需要直接使用服务帐户来创建管理访问”以及如果我需要 node.js对于它,或者我可以使用 Java 以及如何做到这一点。

标签: rest firebase firebase-realtime-database firebase-authentication jwt


【解决方案1】:

最后,在彻底阅读了 firebase 文档后,我想通了。我需要用作 REST API 的安全令牌的是一个 firebase 安全令牌 ID,我可以在使用另一个应用程序(ios、android、web)登录到 firebase 后获得它,例如使用以下代码的 Android

    FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
    mUser.getToken(true)
    .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
        public void onComplete(@NonNull Task<GetTokenResult> task) {
            if (task.isSuccessful()) {
                String idToken = task.getResult().getToken();
                // Send token to your backend via HTTPS
                // ...
            } else {
                // Handle error -> task.getException();
            }
        }
    });

这是我需要设置为查询字符串的 auth 参数的令牌。

完整的参考请看here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    • 2020-09-17
    • 2014-04-06
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多