Firebase令牌验证失败:原正常代码突然报InvalidToken错误
问题重现
前端通过Firebase完成用户注册后,将生成的令牌传入后端同步数据库,后端使用以下代码验证令牌:
let _result: FirebaseUser = FirebaseAuth::new("my-project").await.verify(token) .map_err(|err| Error::msg(format!("{err}")))?;
一周前代码可正常运行,现在执行完全相同的逻辑,会返回InvalidToken错误。对令牌进行Base64解码后,头部信息为:
{"alg":"RS256","kid":"30b221ab65617bcf87ee0f8462f74e36522ca2e4","typ":"JWT"}
令牌格式无明显问题,且已使用新注册用户生成的全新令牌,设备也已配置Google Provider并使用JSON凭证(调试模式下设置),但问题仍未解决。
排查与解决方向
检查Firebase Auth依赖版本:一周前正常现在报错,大概率是依赖包更新引发的兼容性问题。确认后端使用的Firebase Auth SDK(比如Rust的firebase-auth库)是否有版本更新,尝试回退到之前可用的版本,或者查看新版本变更日志,确认验证逻辑是否有调整。
验证令牌完整有效性:虽然头部格式正确,但需确认令牌的payload和签名是否合法。用本地JWT校验工具解析完整令牌,重点检查:
exp字段是否已过期aud字段是否匹配你的Firebase项目IDiss字段是否为https://securetoken.google.com/<你的项目ID>- 签名是否能通过对应
kid的Google公钥验证
检查后端Firebase初始化配置:确认
FirebaseAuth::new("my-project")的初始化逻辑是否正确。部分SDK仅传项目ID时会自动获取凭证,但如果服务器环境变更(如无法访问Google元数据服务),会导致验证失败,建议显式传入服务账户JSON凭证初始化FirebaseAuth。排查网络与防火墙限制:确认后端服务器能正常访问Google的验证服务端点。如果服务器有防火墙或代理,可能会阻断验证请求,导致令牌校验失败。可在服务器上测试curl访问相关端点,确认网络连通性。
检查前端令牌获取方式:确认前端获取的是ID Token而非Access Token。Firebase中需调用
user.getIdToken()获取用于后端验证的ID Token,若误传Access Token,后端会返回InvalidToken错误。
内容的提问来源于stack exchange,提问作者Big_Bad_E

