我认为Firebase Admin SDK缺少一个非常重要的功能(或者可能是它的文档) .
TL; DR:如何使用Admin SDK刷新自定义令牌?
文档(https://firebase.google.com/docs/auth/admin/manage-sessions)说:
Firebase身份验证会话很长时间 . 每次用户登录时,用户凭据都会发送到Firebase身份验证后端,并交换Firebase ID令牌(JWT)和刷新令牌 . Firebase ID令牌是短暂的,持续一个小时;刷新令牌可用于检索新的ID令牌 .
好 . 但是怎么样?没有提及如何使用新的自定义标记替换刷新标记 . 有很多关于如何撤销刷新令牌的文档......
然而,有一个REST api函数说,(https://firebase.google.com/docs/reference/rest/auth/#section-refresh-token)
交换ID令牌的刷新令牌您可以通过向securetoken.googleapis.com endpoints 发出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团队的人可以一劳永逸地回答这个问题 . 请参阅以下链接
谢谢你的时间!!
2 回答
您需要为Id令牌和刷新令牌交换自定义令牌,这是here . 该调用应包括自定义标记和属性"returnSecureToken"为true . 如果未添加此属性或为false,则只能获取ID令牌 .
完成此操作后,您可以使用刷新令牌在过期后获取新的ID令牌 . 见documentation .
自定义令牌和ID令牌都是短暂的(1小时),但目的不同,这就是格式不同的原因 . 您使用Id令牌进行经过身份验证的调用,而自定义令牌仅用于启动会话并获取ID令牌和刷新令牌 .
请记住,如果您使用的是SDK,则整个工作都由SDK处理 .
您不刷新已存在的自定义标记,而是创建新标记并将其交换为Access或Refresh Tokens . 以下是我在目前正在使用的工作项目中的方法
从火焰 Cloud 功能生成自定义令牌
假设你有你的firebase项目和Cloud Functions for Firebase全部设置 .
这就是Cloud Functions index.ts文件的样子:
http GET请求看起来像:
响应如下:
如果未启用,则很可能必须启用IAM(身份和访问管理)并设置服务帐户凭据 . Check the Troubleshooting .
交换定制令牌,用于刷新和访问令牌
http POST请求看起来像:
身体像:
响应如下:
祝好运,