使用 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