如何通过Firebase Auth自定义令牌管控90天最长会话时长?
解决方案与优化思路
一、直接用Firebase Auth自带的会话过期设置(最省心)
没必要自己折腾令牌管理,Firebase Auth本身就支持强制会话90天后失效:
- 打开Firebase控制台,进入Authentication > 设置 > 会话管理,把"会话过期"改成"90天后"。这样用户的刷新令牌会在90天后自动作废,没法再兑换新的ID令牌,客户端会自动触发认证失效,也就访问不了Firestore了。
- 客户端正常走Firebase Auth的自定义令牌登录流程就行,SDK会自动续期ID令牌,直到刷新令牌过期,全程不用自己写额外逻辑。
二、非要自己管ID令牌?用Firestore REST API绕开SDK限制
如果坚持要自己控制ID令牌,官方SDK确实不支持直接附加,但可以直接调用Firestore的REST接口:
- 客户端不用Firestore SDK,直接发HTTP请求,在请求头里加
Authorization: Bearer <你的ID令牌>即可。 - 举个Android的例子(Kotlin):
val client = OkHttpClient() val request = Request.Builder() .url("https://firestore.googleapis.com/v1/projects/你的项目ID/databases/(default)/documents/你的集合路径") .addHeader("Authorization", "Bearer $yourIdToken") .build() val response = client.newCall(request).execute()
- 这种方式需要自己处理数据序列化、离线缓存这些SDK本来就有的功能,开发成本会高不少,除非有特殊需求,不然不推荐。
三、修正你之前的自定义令牌方案
你之前用自定义令牌拿到永不过期的刷新令牌,是因为没做限制。可以这么改:
- 后端用Firebase Admin SDK生成自定义令牌时,给
sessionClaims加个过期时间:
const customToken = admin.auth().createCustomToken(uid, { expiresAt: Date.now() + 90 * 24 * 60 * 60 * 1000 // 90天后过期 });
- 然后在Firebase Auth的自定义令牌验证逻辑里,检查这个
expiresAt字段,过期的直接拒绝兑换ID令牌。 - 同时配合控制台的90天会话过期设置,双重保险,确保刷新令牌到点就失效。
安全提醒
- 不管用哪种方案,绝对不能把刷新令牌返回给客户端,不然等于给了用户长期访问权限。
- 自己管令牌的话,一定要严格验证ID令牌的签名和有效期,别让伪造或者过期的令牌被滥用。
内容的提问来源于stack exchange,提问作者Julien Fouilhé
相关产品推荐
相关产品推荐

