11

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

我希望通过添加 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 的方法。

谷歌的文档对这个问题没有那么详细。知道我可能会尝试解决这个问题吗?

4

1 回答 1

20

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

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

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

有关如何在各种 Firebase 客户端 SDK 中检索访问令牌的说明,请参阅在客户端上检索 ID 令牌。您还可以通过未记录的 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 密钥相同的 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 访问令牌进行身份验证,您需要做的第一件事就是获取一个。有关如何执行此操作的说明,请参阅检索访问令牌。它目前仅包含一个 Java 示例,但这在包括 Node.js 在内的多种语言中都是可能的。获得 ID 令牌后,您可以通过access_token查询参数将其传递给 REST API 以验证请求。该请求将以管理员访问权限发出,覆盖所有 Firebase 安全规则并授予完全读写访问权限。

于 2017-03-21T16:27:30.177 回答