【问题标题】:Reusing the firebase-server-sdk credentials with the REST API通过 REST API 重用 firebase-server-sdk 凭据
【发布时间】:2016-07-30 18:10:31
【问题描述】:

在旧版本的 Firebase 中,我用 Java 编写的服务器应用程序将使用密钥和 JWT 令牌生成器通过我的后端进行身份验证。然后,在任何时候,我都可以调用 Firebase.getAuth().getToken() 并在 HTTP 调用中重用该令牌作为 auth 参数。

使用新的firebase-server-sdk,我将如何通过 REST API 重复使用我有限的服务帐户凭据/令牌?

Map<String, Object> auth = new HashMap<String, Object>();
auth.put("uid", "server-app");

FirebaseOptions options = new FirebaseOptions.Builder()
            .setDatabaseUrl(Environment.FIREBASE_URL)
            .setServiceAccount(MyClass.class.getResourceAsStream("/keys/dev.json"))
            .setDatabaseAuthVariableOverride(auth)
            .build();

FirebaseApp.initializeApp(options);

当我使用 SDK 订阅/写入某些位置时,一切都很好 - 特别是需要 server-app uid 的位置。但我在我的服务器应用程序中结合使用 REST,因为我希望我的服务器应用程序进行同步读取,Firebase 仅通过 REST API 支持。

FirebaseRestClient firebaseRest = new RestAdapter.Builder()
                .setEndpoint(Environment.FIREBASE_URL)
                .setRequestInterceptor(new RequestInterceptor() {
                    @Override
                    public void intercept(final RequestFacade request) {
                        request.addQueryParam("access_token", FirebaseAuth.getInstance().createCustomToken("server-app"));
                    }
                })
                .build().create(FirebaseRestClient.class);

我尝试添加 access_tokenauth 参数。 createCustomToken 方法似乎生成了一个有效的 JWT,但 REST API 没有响应。

当我将 createCustomToken 返回值作为 auth 参数传递时,我收到以下消息:

"error" : "Missing claim 'kid' in auth header."

当我将 createCustomToken 返回值作为 access_token 参数传递时,我得到基本的 Permission denied API 响应。

有没有一种简单的方法可以在 REST API 调用中重用我现有的 firebase-server-sdk 凭据?

【问题讨论】:

    标签: firebase firebase-authentication


    【解决方案1】:

    您尝试使用的令牌是 Firebase 身份验证 ID 令牌 - 该类型旨在传递给客户端上的 Firebase SDK。 REST API 接受 Firebase 访问令牌(就像以前的 Firebase 客户端中的一样)。

    您的身份验证失败,因为 Firebase SDK 通常会负责将您的 ID 令牌转换为访问令牌。您的服务器不能使用 Firebase SDK 执行此转换或生成访问令牌,因此我建议使用原始的 Firebase Token Generator library 和您的 Firebase 密钥来为 REST API 创建访问令牌。即使对于自 I/O 版本以来创建的新 Firebase 项目,这也可以正常工作。

    注意:在控制台中,可以在(齿轮图标)> 项目设置> 数据库下找到您的数据库密码。

    【讨论】:

    • Abe,由于数据库机密现在已被弃用,您是否对此有更新?
    【解决方案2】:

    鉴于无证财产的名称,我确定不建议这样做,但是...

    如果您的 SDK 已使用 serviceAccount 登录,您可以使用 firebase.auth().INTERNAL.getToken(),它返回一个承诺的 accessToken(和 expirationTime),然后与 ?access_token 参数一起使用。

    【讨论】:

    • 我应该补充一点,这是针对 node.js SDK 的。
    猜你喜欢
    • 2018-06-24
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多