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

如何用Firebase Emulator Suite模拟过期Auth令牌测试处理逻辑

模拟Firebase Auth令牌过期的几种实用方法

针对开发环境使用Firebase Emulator Suite的场景,有几个不用等1小时就能测试令牌过期逻辑的方法:

1. 手动篡改本地存储的JWT令牌

Firebase ID令牌是标准JWT,你可以直接修改它的过期时间:

  • 打开浏览器开发者工具(F12)的Application标签,找到Firebase Auth存储的令牌(通常在localStorage的firebase:authUser:...键下,或IndexedDB的firebaseLocalStorageDb中)
  • 提取idToken字段,用jwt-decode库(可通过npm安装)在控制台解码,将exp字段(过期时间戳)改为当前时间减去几十秒
  • 重新编码修改后的JWT内容,替换回原idToken字段,刷新页面后Auth会识别为令牌过期

2. 通过Firebase Emulator REST API生成过期令牌

Firebase Auth Emulator提供REST接口,可直接生成自定义过期时间的令牌:

  • 先在Emulator UI的Auth面板创建一个测试用户,获取其UID
  • 用firebase-admin写一段Node.js脚本,生成有效期极短的自定义令牌:
    import * as admin from 'firebase-admin';
    admin.initializeApp({ projectId: '你的项目ID' });
    
    // 生成1秒后过期的自定义令牌
    const customToken = await admin.auth().createCustomToken('测试用户UID', {}, { expiresIn: '1s' });
    
    使用该令牌登录后,1秒内即可触发令牌过期状态

3. 在代码中模拟令牌过期错误

在开发环境代码中添加测试逻辑,强制触发过期错误:

  • 前端React代码中,重写getIdToken方法返回过期令牌:
    if (process.env.NODE_ENV === 'development') {
      const currentUser = firebase.auth().currentUser;
      if (currentUser) {
        const originalGetIdToken = currentUser.getIdToken.bind(currentUser);
        currentUser.getIdToken = async () => {
          const validToken = await originalGetIdToken();
          const [header, payload, signature] = validToken.split('.');
          const decodedPayload = JSON.parse(atob(payload));
          // 将过期时间改为1分钟前
          decodedPayload.exp = Math.floor(Date.now() / 1000) - 60;
          return `${header}.${btoa(JSON.stringify(decodedPayload))}.${signature}`;
        };
      }
    }
    
  • 后端Node.js中,添加环境变量触发模拟过期:
    if (process.env.NODE_ENV === 'development' && process.env.TEST_EXPIRED_TOKEN) {
      throw new admin.auth().TokenExpiredError('Token expired');
    }
    

4. 修改系统时间(最简单但有副作用)

直接将电脑/浏览器时间调快1小时,Firebase Auth会依据本地时间判定令牌过期。此方法无需改代码,但可能影响其他依赖时间的应用,测试后记得改回原时间。

内容的提问来源于stack exchange,提问作者Jeremy Kayes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:07:14