【问题标题】:Firebase REST auth when creating token with node.js admin sdk使用 node.js admin sdk 创建令牌时的 Firebase REST 身份验证
【发布时间】:2017-08-13 03:36:27
【问题描述】:

我知道这个问题在这里被问了很多,但我似乎仍然找不到可以解决我的问题的确切答案。

我希望通过添加 access_token 参数来使用 REST 调用访问 Firebase。

access_token 是使用 Node.js Admin SDK 创建的,使用以下代码:

var admin = require("firebase-admin");

var serviceAccount = require("./pk.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "https://XXX.firebaseio.com"
});

var uid = "1234";


admin.auth().createCustomToken(uid)
  .then(function(customToken) {
    // Send token back to client
    console.log("Token: "+customToken);
  })
  .catch(function(error) {
    console.log("Error creating custom token:", error);
  });

问题是,如果我获取从 Node.js 创建的令牌并在我的 REST 调用中使用它,我会收到 Unauthorized request 错误。

我在一些问题中读到人们在发布令牌时添加了范围参数,但还没有找到使用 Node.js Admin SDK 的方法。

Google 的文档没有详细说明这个问题。知道我可能会尝试解决这个问题吗?

【问题讨论】:

    标签: node.js firebase oauth firebase-authentication firebase-admin


    【解决方案1】:

    您用于向 Firebase REST API 进行身份验证的令牌不是正确的令牌类型。您正在使用 Firebase Auth 自定义令牌,该令牌只能用于通过 signInWithCustomToken() 方法对其中一个 Firebase 客户端 SDK 进行身份验证,如 Sign in using custom tokens on clients 中所述。

    为了向 Firebase REST API 进行身份验证,您有两种选择:Firebase ID 令牌(用于基于用户的访问)或 Google OAuth2 访问令牌(用于管理员访问)。

    使用 Firebase ID 令牌进行身份验证

    有关如何在各种 Firebase 客户端 SDK 中检索访问令牌的说明,请参阅 Retrieve ID tokens on the client。您还可以通过未记录的 REST API 将 Firebase 自定义令牌换成 ID 令牌和刷新令牌对:

    端点: https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=<API_KEY>

    方法: POST

    请求正文: { "token": <CUSTOM_TOKEN>, "returnSecureToken": true }

    <API_KEY> 与您从 Firebase 控制台获得的 API 密钥与您在 Firebase 客户端中使用的 API 密钥相同。 <CUSTOM_TOKEN> 是 Firebase 自定义令牌。

    由于 ID 令牌在一小时后过期,您将需要使用刷新令牌通过其他未记录的 REST API 刷新它们:

    端点: https://securetoken.googleapis.com/v1/token?key=<API_KEY>

    方法: POST

    请求正文: { "refresh_token": <REFRESH_TOKEN>, "grant_type": "refresh_token" }

    <API_KEY> 与之前的 API 密钥相同。 <REFRESH_TOKEN> 是上一次 API 调用的刷新令牌。

    获得 ID 令牌后,您可以通过 auth 查询参数将其传递给 REST API 以验证请求。该请求遵守 Firebase 安全规则,就好像登录到客户端的最终用户正在发出请求一样。

    使用 Google 访问令牌进行身份验证

    要使用 Google OAuth2 访问令牌进行身份验证,您需要做的第一件事就是获取一个。有关如何执行此操作的说明,请参阅Retrieving an access token。它目前仅包含一个 Java 示例,但这在包括 Node.js 在内的多种语言中都是可能的。获得 ID 令牌后,您可以通过 access_token 查询参数将其传递给 REST API 以验证请求。该请求将以管理员权限发出,覆盖所有 Firebase 安全规则并授予完全读写权限。

    【讨论】:

    • 所以如果我理解正确的话,没有客户端 SDK(服务器的 REST)就无法获取 ID 令牌?
    • 实际上,您可以使用一个未记录的 REST API。我实际上正在努力在我们的官方文档中记录这个 REST API,但同时我已经更新了我的答案以让你畅通无阻。
    • 感谢@jacobawenger,但是当我尝试按照您的指示操作时,我收到“无法验证签名”。在使用 id_token 作为 auth 参数的值之后.. 可能有什么问题?
    • 所以我明白了为什么会出现验证错误,因为我试图从 IDE 而不是浏览器进行测试。当我从浏览器发送 REST 请求时,它使用 ID 令牌。
    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2017-10-09
    • 2014-02-25
    • 2019-09-01
    • 1970-01-01
    • 2019-10-25
    • 2019-06-28
    相关资源
    最近更新 更多