使用 node.js admin sdk 创建令牌时的 Firebase REST 身份验证

Firebase REST auth when creating token with node.js admin sdk

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

我希望通过添加 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 的文档没有详细说明这个问题。知道我可以尝试解决这个问题吗?

您用于向 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 客户端中使用的 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 安全规则并授予完整的读写权限。