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

Posted

技术标签:

【中文标题】使用 node.js admin sdk 创建令牌时的 Firebase REST 身份验证【英文标题】:Firebase REST auth when creating token with node.js admin sdk 【发布时间】: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 的文档没有详细说明这个问题。知道我可能会尝试解决这个问题吗?

【问题讨论】:

【参考方案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 令牌。

以上是关于使用 node.js admin sdk 创建令牌时的 Firebase REST 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

“调用者没有权限”尝试使用 Firebase Admin SDK 创建自定义令牌

Keycloak:使用 keycloak-admin 为用户生成访问令牌

有没有办法从我的 Node.js 服务器使用 Firebase Admin SDK 发送验证电子邮件?

使用 node.js 的 Keycloak Rest API

AWS Cognito:生成令牌并在使用 amazon-cognito-identity-js SDK 刷新后

Firebase admin sdk:用于授权的 idToken 或自定义令牌验证