Spring Boot FCM向Expo RN推送报SenderId mismatch错误如何解决
问题本质
SenderID mismatch 报错的核心触发条件是:当前发送请求使用的鉴权身份、消息接收方的推送令牌、调用的FCM接口所属项目三者不匹配。
你当前操作中存在两个核心的配置混淆:
- 新旧FCM鉴权逻辑混用
- 变量存储的值类型完全错误
错误定位与修复步骤
1. 区分两套FCM鉴权体系,禁止交叉混用
当前FCM存在两套独立的鉴权逻辑,不能混合使用:
- 旧版已逐步废弃的HTTP接口:需要在请求头携带
Authorization: key=[旧版Server Key],对应请求地址为https://fcm.googleapis.com/fcm/send - 新版官方推荐的v1接口:通过Firebase服务账号私钥自动生成OAuth2访问凭证做鉴权,完全不需要手动传入Server Key,对应请求地址就是你报错日志中出现的
https://fcm.googleapis.com/v1/projects/[项目ID]/messages:send
你现在的操作就是把两套体系的逻辑混在了一起: - 初始化阶段用了新版v1接口要求的私钥认证
- 发送阶段错误携带了旧版Server Key做鉴权,自然会触发项目校验不通过
2. 修正代码中的值类型错误
你代码中写死的AAAAm_p0hoc:****格式的字符串,本质是旧版FCM的Server Key值,根本不是设备端的推送接收令牌。
正确的推送接收令牌获取逻辑:
- Expo项目配置FCM适配完成后,通过Expo SDK调用
getDevicePushTokenAsync()方法获取当前设备的FCM注册令牌,这个令牌是设备在对应Firebase项目下生成的合法接收标识 - 发送消息时,把这个从设备端获取的令牌作为消息目标传入,而不是把服务端的Server Key填进去
3. 保证项目配置全链路一致
- 确认Expo项目中配置的
google-services.json文件内的项目ID、Sender ID,和Spring Boot端加载的私钥所属的Firebase项目完全一致 - 新建Firebase项目后,必须让Expo应用重新拉取一次设备推送注册令牌,不能直接复用旧项目下生成的设备令牌,否则会因为令牌所属项目和当前服务端鉴权项目不匹配触发报错
4. 简化发送逻辑
如果已经通过私钥初始化了FirebaseApp实例,不需要手动拼接FCM接口请求,直接获取内置的FirebaseMessaging实例调用send()方法即可。SDK会自动完成鉴权、请求拼接的全流程,从根源上避免鉴权逻辑混用的问题。
内容的提问来源于stack exchange,提问作者Thiago Silva
相关产品推荐
相关产品推荐

