如何用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脚本,生成有效期极短的自定义令牌:
使用该令牌登录后,1秒内即可触发令牌过期状态import * as admin from 'firebase-admin'; admin.initializeApp({ projectId: '你的项目ID' }); // 生成1秒后过期的自定义令牌 const customToken = await admin.auth().createCustomToken('测试用户UID', {}, { expiresIn: '1s' });
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
相关产品推荐
相关产品推荐

