Firebase Auth: 一小时后无法刷新管理员自定义令牌。
Firebase Auth: 一小时后无法刷新管理员自定义令牌。
我认为Firebase Admin SDK缺少一个非常重要的功能(或许是缺少相应的文档)。
简而言之:如何使用Admin SDK刷新自定义令牌?
文档(https://firebase.google.com/docs/auth/admin/manage-sessions)中提到:
Firebase身份验证会话是长期有效的。每次用户登录时,用户凭据会发送到Firebase身份验证后端,并交换为Firebase ID令牌(JWT)和刷新令牌。Firebase ID令牌的有效期较短,为1小时;刷新令牌可用于获取新的ID令牌。
好吧,但是怎么做呢?文档中没有提到如何用新的自定义令牌替换刷新令牌。有很多关于如何撤销刷新令牌等的文档...
然而,有一个REST API函数(https://firebase.google.com/docs/reference/rest/auth/#section-refresh-token)可以实现以下功能:
通过向securetoken.googleapis.com端点发出HTTP POST请求,可以刷新Firebase ID令牌。
然而,从这个API调用中获得的access_token(JWT)也不被接受。而且JWT的格式甚至不相似。以下是两个检索到(解码的)自定义令牌的示例:
i. 使用Admin SDK的admin.auth().createCustomToken(uid)方法获得
{
"uid": "9N5veUXXXXX7eHOLB4ilwFexQs42",
"iat": 1521047461,
"exp": 1521051061,
"aud": "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit",
"iss": "XXX@appspot.gserviceaccount.com",
"sub": "XXX@appspot.gserviceaccount.com"
}
ii. 使用https://securetoken.googleapis.com/v1/token?key=[API_KEY]调用
{
"iss": "https://securetoken.google.com/XXX",
"aud": "XXX",
"auth_time": 1521047461,
"user_id": "9N5veUXXXXX7eHOLB4ilwFexQs42",
"sub": "9N5veUXXXXX7eHOLB4ilwFexQs42",
"iat": 1521051719,
"exp": 1521055319,
"email": "jabbar@gmail.com",
"email_verified": false,
"firebase": {
"identities": {
"email": [
"jabbar@gmail.com"
]
},
"sign_in_provider": "password"
}
}
关于这个问题已经有很多问题提出。也许Firebase团队的某人能最终回答。请参阅以下链接。
感谢您的时间!
Firebase Auth : Admin自定义令牌在一小时后无法刷新的原因和解决方法
问题出现的原因:
根据上述所提供的内容,可以得出以下结论:
- 使用Firebase Android SDK时,不需要手动刷新自定义令牌。
- 如果使用iOS或Android SDK并且遇到了这个问题,可能是设置问题。
- Firebase SDK会在正确设置的情况下自动刷新令牌。
- FirebaseAuth的signInWithCustomToken函数被调用后,SDK会负责保持令牌的更新。
解决方法:
- 确保Android应用程序的SHA1证书在Firebase管理控制台中。
- 添加SHA1证书后,需要下载google-services.json文件并将其添加到应用程序中。
根据上述内容,我们可以得出结论:使用Firebase Auth : Admin自定义令牌时,如果遇到无法刷新令牌的问题,可能是由于设置问题导致的。要解决此问题,首先确保Android应用程序的SHA1证书已添加到Firebase管理控制台,并下载并添加google-services.json文件。这样,SDK将能够自动刷新令牌,确保令牌始终处于最新状态。
// 示例代码 // 初始化Firebase Admin SDK var admin = require("firebase-admin"); // 设置服务帐户密钥 var serviceAccount = require("path/to/serviceAccountKey.json"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: "https://.firebaseio.com" }); // 创建自定义令牌 var uid = "some-uid"; admin.auth().createCustomToken(uid) .then(function(customToken) { // 使用自定义令牌进行身份认证 return admin.auth().signInWithCustomToken(customToken); }) .catch(function(error) { console.log("Error authenticating with custom token:", error); });
Firebase Auth : Admin custom tokens cannot be refreshed after one hour
Firebase Auth的Admin自定义令牌在一小时后无法刷新
问题原因:Firebase Auth的Admin自定义令牌在生成后的一小时内有效,过期后无法刷新。
解决方法:生成新的自定义令牌并用其交换访问令牌或刷新令牌。
具体操作步骤如下:
1. 在Firebase Cloud Functions中生成自定义令牌:
首先,确保已经设置好Firebase项目和Cloud Functions。然后,创建一个Cloud Functions的index.ts文件,代码如下:
import * as functions from 'firebase-functions'; import * as admin from "firebase-admin"; export const getCustomToken = functions.https.onRequest((request, response) => { if (admin.apps.length < 1) { //Checks if app already initialized admin.initializeApp(); } const uid = "USER_UUID"; //替换为实际的用户UUID admin.auth().createCustomToken(uid) .then(function(customToken) { console.log(customToken.toString); response.send(customToken); }) .catch(function(error) { console.log("Error creating custom token:", error); }); });
2. 发起HTTP GET请求来获取自定义令牌:
请求URL为:
https://us-central1-.cloudfunctions.net/getCustomToken
返回的响应将包含自定义令牌。
3. 通过发起HTTP POST请求来交换自定义令牌以获取访问令牌和刷新令牌:
请求URL为:
https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key=
请求体为:
{
"token":"<自定义令牌>",
"returnSecureToken":true
}
返回的响应将包含访问令牌、刷新令牌以及有效期。
需要注意的是,在获取访问令牌和刷新令牌后,可以根据需要在任何地方使用。
以上就是解决Firebase Auth的Admin自定义令牌无法刷新的方法。希望对你有所帮助!
Firebase Auth :Admin自定义令牌在一小时后无法刷新的原因及解决方法
在Firebase中,您需要将自定义令牌(custom token)交换为Id Token和Refresh Token。可以在这里找到相关信息。调用应包括自定义令牌和属性“returnSecureToken”,值为true。如果未添加此属性或属性值为false,则只会获得Id Token。
完成上述步骤后,您可以使用Refresh Token在其过期后获取新的Id Token。请参阅文档。
自定义令牌和Id Token都是短期的(1小时),但用途不同,因此格式也不同。使用Id Token进行身份验证调用,而自定义令牌仅用于启动会话并获取Id Token和Refresh Token。
请注意,如果您使用的是SDK,则整个过程由SDK处理。
那么,在admin-sdk中的verifyToken方法会发生什么?如果验证发送的令牌,那么它是否有效?
当您从客户端向服务器发送请求时,将随请求发送当前的Id Token。然后,您将使用verifyToken函数验证请求是否来自有效来源。