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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:42:53