FCM V1 API迁移遇SENDER_ID_MISMATCH错误排查求助
解决FCM V1迁移中的SENDER_ID_MISMATCH 403错误(Elixir + Pigeon + Goth)
核心问题定位
SENDER_ID_MISMATCH本质是服务账号对应的Firebase项目与客户端FCM令牌关联的Firebase项目不匹配,哪怕服务账号有管理员权限,项目不对就会触发PERMISSION_DENIED错误。
分步解决方案
1. 确认FCM令牌的归属项目
- 让测试用户用更新后的
google-services.json重新构建应用,完全卸载旧应用后重装,退出登录再获取新的FCM令牌。 - 打开Firebase控制台,进入该令牌对应的项目,在「Cloud Messaging」→「发送测试消息」中输入这个令牌,发送测试消息。如果测试失败,说明客户端
google-services.json仍未正确配置:- 确保Android端
google-services.json放在app模块根目录 - 检查app/build.gradle中是否添加了
apply plugin: 'com.google.gms.google-services' - 同步项目后重新打包安装
- 确保Android端
2. 创建/匹配服务账号
- 打开Firebase控制台(和令牌归属的同一个项目),点击左上角齿轮→「项目设置」→「服务账号」→「生成新的私钥」,下载JSON文件。这个服务账号必须和令牌所属项目完全一致。
- 配置服务账号权限:
- 进入同一个项目的Google Cloud控制台→「IAM与管理员」→「IAM」
- 找到刚创建的服务账号,点击编辑,添加「Firebase Admin SDK Administrator Service Agent」角色(这个角色专门用于FCM发送,权限足够,无需全局管理员)
3. 配置Goth与Pigeon V2
- Goth配置:确保
config.exs指向正确的服务账号JSON:
# 本地文件方式 config :goth, json: "priv/service-account.json" |> File.read!() # 环境变量方式(推荐生产环境) config :goth, json: System.get_env("GCP_FCM_SERVICE_ACCOUNT_JSON")
- Pigeon V2配置:启用FCM V1适配器并关联Goth:
config :pigeon, :fcm, adapter: Pigeon.FCM.V1, goth: Pigeon.FCM.V1.Goth
- 发送消息示例:使用V1的消息结构:
def send_fcm_notification(token) do msg = Pigeon.FCM.V1.Message.new() |> Pigeon.FCM.V1.Message.put_token(token) |> Pigeon.FCM.V1.Message.put_notification(%{title: "通知标题", body: "通知内容"}) |> Pigeon.FCM.V1.Message.put_data(%{"key" => "value"}) Pigeon.FCM.V1.push(msg) end
4. 清除缓存
- Goth可能缓存旧的OAuth令牌,重启Elixir应用,或手动清除缓存:
Goth.TokenStore.delete("https://www.googleapis.com/auth/firebase.messaging")
- 客户端确保完全卸载旧应用,避免旧令牌残留。
关于oauth_client的疑问解答
- 旧服务账号文件中的
oauth_client字段是用于OAuth 2.0客户端身份验证的,Goth完全不需要这个字段。Goth只依赖服务账号JSON中的private_key、client_email等核心字段,新生成的服务账号JSON自带这些信息,即使没有组织也能正常工作。 - 不需要创建Cloud Identity或组织,旧的
oauth_client只是额外配置,和FCM V1的发送逻辑无关,无需花费精力去创建。
内容的提问来源于stack exchange,提问作者Sinc
相关产品推荐
相关产品推荐

