You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase Admin SDK(Node.js)自定义令牌如何无感知刷新?求方案

自定义令牌刷新的优质方案

Google Admin SDK生成的自定义令牌本身不支持原生refresh token机制,以下是几个落地性强的无感知续期方案,替代每次应用激活调用接口的方式:

1. 提前静默刷新(推荐)

  • 客户端在令牌过期前10-15分钟,自动向服务端发起静默刷新请求(无需用户操作)
  • 服务端复用原createCustomToken逻辑生成新令牌返回给客户端
  • 客户端替换本地令牌,实现无感知续期
  • 客户端伪代码示例:
    // 调度令牌刷新任务
    function scheduleTokenRefresh(tokenExpiryTime) {
      const refreshOffset = 15 * 60 * 1000; // 提前15分钟刷新
      const refreshTriggerTime = tokenExpiryTime - refreshOffset;
      const delay = refreshTriggerTime - Date.now();
      
      setTimeout(() => {
        fetch('/api/refresh-token', {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({ uid: 'some-uid' })
        })
        .then(res => res.json())
        .then(data => {
          localStorage.setItem('customToken', data.customToken);
          // 重新调度下一次刷新
          scheduleTokenRefresh(Date.now() + 3600 * 1000);
        })
        .catch(err => console.error('Token refresh failed:', err));
      }, delay);
    }
    
  • 服务端只需新增一个接口,直接复用原创建令牌的逻辑即可

2. 短令牌+长期会话标识

  • 服务端给客户端返回两个内容:1小时有效期的自定义令牌 + 长期会话ID(比如用JWT,有效期设为7-30天,存入HttpOnly Cookie)
  • 客户端刷新令牌时,自动携带会话ID,服务端验证会话合法性后直接生成新的自定义令牌返回
  • 优势:避免每次刷新重复走复杂身份校验,且HttpOnly Cookie比客户端本地存储更安全
  • 服务端核心逻辑示例:
    // 登录接口:返回自定义令牌和会话ID
    app.post('/api/login', (req, res) => {
      const uid = req.body.uid;
      getAuth().createCustomToken(uid)
        .then(customToken => {
          // 生成长期会话JWT
          const sessionToken = jwt.sign({ uid }, 'your-server-secret', { expiresIn: '7d' });
          // 设置HttpOnly安全Cookie
          res.cookie('session_id', sessionToken, { 
            httpOnly: true, 
            secure: process.env.NODE_ENV === 'production',
            sameSite: 'strict'
          });
          res.json({ customToken });
        })
        .catch(err => res.status(500).json({ error: 'Failed to generate token' }));
    });
    
    // 刷新令牌接口
    app.post('/api/refresh-token', (req, res) => {
      const sessionToken = req.cookies.session_id;
      if (!sessionToken) return res.status(401).json({ error: 'Unauthorized' });
      
      jwt.verify(sessionToken, 'your-server-secret', (err, decoded) => {
        if (err) return res.status(401).json({ error: 'Invalid session' });
        // 生成新的自定义令牌
        getAuth().createCustomToken(decoded.uid)
          .then(customToken => res.json({ customToken }))
          .catch(err => res.status(500).json({ error: 'Failed to refresh token' }));
      });
    });
    

3. 业务请求前智能刷新

  • 客户端在发起每一次业务请求前,先检查令牌剩余有效期(比如是否不足5分钟)
  • 如果即将过期,先调用刷新接口获取新令牌,再用新令牌发起业务请求
  • 处理并发请求:当多个请求同时检测到令牌过期时,只发起一次刷新请求,其他请求等待刷新完成后复用新令牌
  • 适合业务请求频率较低的场景,避免不必要的定时任务

关键注意事项

  • 所有刷新接口必须做限流处理,防止恶意刷取令牌
  • 会话标识的校验逻辑要严格,避免身份伪造
  • 客户端要处理刷新失败的场景(比如会话过期),此时引导用户重新登录

内容的提问来源于stack exchange,提问作者Adam Dahan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:35:05