You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Firebase Auth:Admin自定义令牌1小时后无法刷新,如何用Admin SDK刷新?

解决Firebase Admin自定义令牌无法刷新的问题

首先得明确一个关键误区:Firebase自定义令牌本身是一次性使用的凭证,并不支持直接刷新——这可能是你困惑的核心原因。

为什么自定义令牌1小时后"失效"?

你提到的1小时有效期,其实是Firebase ID令牌的有效期,而非自定义令牌。自定义令牌的有效期通常只有5分钟,而且只能用来完成一次登录流程:当用户用自定义令牌登录Firebase Auth后,后端会返回ID令牌(1小时有效期)刷新令牌(长期有效,除非被吊销)。之后的会话维持和令牌刷新,都是靠客户端自动用刷新令牌去获取新的ID令牌,完全不需要再调用Admin SDK生成自定义令牌。

正确的会话刷新流程

正常情况下,客户端Firebase SDK会自动处理ID令牌的刷新:

  • 当ID令牌即将过期时,SDK会静默调用刷新接口,用本地存储的刷新令牌换取新的ID令牌和刷新令牌(如果有更新)
  • 这个过程完全在客户端完成,不需要后端/Admin SDK参与

什么时候需要Admin SDK介入?

如果你的业务场景需要强制更新用户的身份凭证(比如用户权限变更、角色调整),可以通过以下方式处理:

  1. 吊销用户的刷新令牌:使用Admin SDK调用revokeRefreshTokens(uid),这样客户端的旧刷新令牌会失效,下次请求时会触发重新认证
  2. 生成新的自定义令牌:当客户端触发重新认证时,后端再生成新的自定义令牌返回给客户端,客户端用它重新登录,获取新的ID令牌和刷新令牌

代码示例

1. Admin SDK生成自定义令牌

const admin = require('firebase-admin');

async function createCustomToken(uid, additionalClaims) {
  try {
    const customToken = await admin.auth().createCustomToken(uid, additionalClaims);
    return customToken;
  } catch (error) {
    console.error('Error creating custom token:', error);
    throw error;
  }
}

2. 客户端用自定义令牌登录并自动刷新

// Web客户端示例
firebase.auth().signInWithCustomToken(customToken)
  .then((userCredential) => {
    // 登录成功,SDK会自动处理后续的令牌刷新
    const user = userCredential.user;
    // 主动获取新ID令牌(可选,SDK会自动刷新)
    user.getIdToken(true).then((idToken) => {
      // 使用新的ID令牌调用后端接口
    });
  })
  .catch((error) => {
    console.error('Sign in error:', error);
  });

补充说明

Firebase Auth的会话设计是依赖刷新令牌维持长期会话,自定义令牌只是用来初始化登录的"入口凭证"。文档里提到的"长期有效会话",指的是通过刷新令牌可以持续获取新的ID令牌,而不是自定义令牌本身长期有效。

内容的提问来源于stack exchange,提问作者Kemal Yalcinkaya

火山引擎 最新活动