迁移FCM至HTTP v1:Android应用AccessToken获取异常排查
FCM HTTP v1迁移AccessToken生成报错「Invalid grant: account not found」的排查方案
可能原因
- 应用加载服务账号JSON文件时出现异常,导致关键字段缺失或格式损坏
- OAuth请求的JWT参数构造错误,包括签名算法、payload字段、请求格式
- 应用运行环境的网络/代理干扰了OAuth请求
- 服务账号密钥存在隐性问题(虽gcli可用,但应用场景下触发异常)
解决步骤
1. 验证JSON文件加载完整性
- 打印应用中读取到的JSON内容,和本地原始文件逐字段对比:重点确认
client_email、private_key、private_key_id、client_id完整无错 - 若为Android应用,确保文件放在
assets目录,读取时用字节流完整读取,避免编码或换行符丢失(比如private_key中的换行符不能被替换为空格)
2. 核对OAuth请求参数与JWT构造
- 确认JWT的payload包含以下必填字段:
iss:服务账号的client_emailscope:固定为https://www.googleapis.com/auth/firebase.messagingaud:固定为https://oauth2.googleapis.com/tokenexp:当前时间戳+3600(有效期不能超过3600秒)iat:当前时间戳
- 签名必须使用RS256算法,确保
private_key被正确解析(注意JSON中的private_key带换行,需保留原始格式) - POST请求的
Content-Type必须设为application/x-www-form-urlencoded,参数为grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer和assertion=生成的JWT串
3. 排查服务账号与密钥状态
- 登录Google Cloud控制台,确认目标服务账号处于「启用」状态,且已绑定
Cloud Messaging Admin角色 - 尝试重新生成服务账号密钥(下载新的JSON文件),替换应用中的旧文件后重试
4. 检查应用网络环境
- 打印应用发起的OAuth请求完整细节(URL、请求头、参数),与gcli的请求对比(可执行
gcloud auth print-access-token --log-http查看gcli请求日志) - 测试应用运行环境能否直接访问
oauth2.googleapis.com,排除防火墙、代理导致的请求篡改或截断问题
内容的提问来源于stack exchange,提问作者SSpawner
相关产品推荐
相关产品推荐

