Firebase自定义令牌登录:signInWithCustomToken与createSessionCookie报错auth/invalid-id-token
问题排查与解决方案
我帮你梳理下几个大概率导致这个auth/invalid-id-token错误的原因,都是我之前做Firebase会话Cookie时踩过的坑:
1. 后端Admin SDK未关联本地模拟器
你启动了Firebase模拟器,但后端的Admin SDK默认会连接Firebase生产环境——而模拟器生成的ID Token在生产环境是不被认可的,这是最常见的问题。
修复方案:在后端代码开头添加模拟器配置,让Admin SDK指向本地Auth模拟器:
// 后端代码顶部加入 if (process.env.NODE_ENV === 'development') { admin.initializeApp({ credential: admin.credential.applicationDefault(), }); // 指向Auth模拟器默认端口9099,可从emulator启动日志确认端口 admin.auth().useEmulator('http://localhost:9099'); }
2. 本地测试时Cookie的secure选项设置错误
你的后端设置了secure: true,但本地localhost通常是HTTP协议(非HTTPS),secure: true的Cookie只能在HTTPS环境下写入,虽然这不是当前令牌错误的直接原因,但后续也会导致Cookie无法正常设置,建议一起修正:
修复方案:根据环境动态配置secure选项:
// 替换原有的options配置 const isProduction = process.env.NODE_ENV === 'production'; const options = { maxAge: expiresIn, httpOnly: true, secure: isProduction, // 仅生产环境启用secure sameSite: 'strict' // 建议添加,提升Cookie安全性 };
3. 前端未连接到本地模拟器(补充验证)
如果前端Firebase SDK没关联模拟器,生成的Token会是生产环境的,和后端模拟器的令牌不兼容。可以在前端代码顶部添加模拟器连接配置:
// 前端代码顶部加入 if (location.hostname === 'localhost') { firebase.auth().useEmulator('http://localhost:9099'); firebase.functions().useEmulator('localhost', 5001); }
另外,你可以在前端拿到ID Token后,用模拟器的验证接口快速排查Token有效性:
// 控制台执行,验证Token是否有效 fetch('http://localhost:9099/identitytoolkit.googleapis.com/v1/accounts:lookup?key=your-api-key', { method: 'POST', body: JSON.stringify({idToken: usertoken}) }) .then(res => res.json()) .then(console.log)
如果返回用户信息,说明Token是有效的;如果报错,再排查自定义令牌生成环节。
按照上面的步骤调整后,重新走测试流程应该就能解决令牌无效的问题了。
内容的提问来源于stack exchange,提问作者jcmargentina
相关产品推荐
相关产品推荐

