调用Firebase Cloud Messaging POST接口时遭遇403 HTTP错误
我之前切换FCM版本时也踩过一模一样的坑——明明已经启用了FCM API,用OAuth2调用v1接口却一直返回403。结合我的排查经验,给你梳理几个容易被忽略的关键点:
检查服务账号的权限配置
这是最常见的问题根源。你使用的OAuth2服务账号必须拥有FCM消息发送的权限,最直接的方式是给它添加Firebase Cloud Messaging Admin角色:- 打开Google Cloud控制台的IAM页面,找到对应的服务账号
- 点击编辑按钮,添加角色,搜索并选择「Firebase Cloud Messaging Admin」后保存
注意:Viewer、Editor这类通用权限不一定包含FCM的发送权限,必须明确添加FCM相关的角色。
验证OAuth2令牌的权限范围
获取令牌时请求的scope必须是https://www.googleapis.com/auth/firebase.messaging,如果scope不正确,哪怕令牌有效也会被拒绝。你可以用JWT解码工具查看令牌payload里的scope字段,确认是否包含这个值。确认项目关联与API状态同步
虽然你说FCM API已启用,但要确认这个API是在服务账号所属的Google Cloud项目下启用的。有时候会不小心在不同项目间操作,导致API和服务账号不匹配。另外,也可以尝试先禁用再重新启用FCM API,避免控制台状态缓存导致的不同步问题。核对服务账号密钥文件的正确性
Legacy API用的是服务器密钥,而v1版本依赖服务账号的JSON密钥文件。要确保你下载的密钥文件属于正确的服务账号,并且代码里正确加载了这个文件来生成OAuth2令牌——如果密钥文件不对,生成的令牌自然没有权限。用最小化示例测试排查
可以先抛开业务代码,用curl做一个最简单的测试,排除代码逻辑的干扰:# 配置服务账号密钥路径 export GOOGLE_APPLICATION_CREDENTIALS="/path/to/your/service-account.json" # 获取访问令牌 ACCESS_TOKEN=$(gcloud auth application-default print-access-token) # 调用FCM v1接口发送测试消息 curl -X POST "https://fcm.googleapis.com/v1/projects/[你的项目ID]/messages:send" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "message": { "token": "[测试设备的FCM令牌]", "notification": { "title": "测试标题", "body": "测试内容" } } }'如果这个示例也返回403,那问题肯定出在权限或令牌配置上;如果能成功发送,再回头检查业务代码里的调用逻辑。
内容的提问来源于stack exchange,提问作者user1701806

