FCM OAuth2订阅主题报错:使用服务器密钥认证已弃用
问题描述
使用OAuth2令牌向单个设备推送FCM通知正常,但调用https://iid.googleapis.com/iid/v1:batchAdd接口添加设备到主题时,返回错误:
result= {"error":"Authentication using server key is deprecated. Please use an OAuth2 token instead."}
使用的access-token与单设备推送时完全一致。
可能原因及解决步骤
检查OAuth2令牌的权限范围
FCM主题管理接口要求令牌必须包含https://www.googleapis.com/auth/firebase.messaging权限范围。确认生成access-token时,请求的scope包含该值,而非仅使用单设备推送所需的部分权限。验证服务账号权限
生成令牌的服务账号必须拥有Firebase Cloud Messaging Admin角色,或者至少具备firebase.messaging.topics.update权限。前往Firebase控制台的IAM页面,检查服务账号的权限配置是否符合要求。确认令牌生成逻辑正确性
确保getAccessToken()函数是基于服务账号JSON密钥,通过标准OAuth2流程生成的令牌,而非误用了已废弃的服务器密钥。建议使用Google官方客户端库生成令牌,避免手动实现的潜在错误:// 示例:使用Google官方库生成FCM OAuth2令牌 require __DIR__ . '/vendor/autoload.php'; use Google\Auth\Credentials\ServiceAccountCredentials; function getAccessToken() { $credentials = new ServiceAccountCredentials( 'https://www.googleapis.com/auth/firebase.messaging', '/path/to/your-service-account-key.json' ); $token = $credentials->fetchAuthToken(); return $token['access_token']; }检查请求参数格式
确认请求的JSON参数格式无误,确保registration_tokens是有效的设备令牌数组:$topic = "{$card_id}_{$type}_{$locale}"; $url = "https://iid.googleapis.com/iid/v1:batchAdd"; $json = [ "to" => "/topics/{$topic}", "registration_tokens" => [$fcm_token] ];
额外排查点
- 打印curl请求的HTTP状态码,若返回401/403,说明令牌或权限确实存在问题;
- 验证生成的access-token,确认其包含正确的scope和有效期限。
内容的提问来源于stack exchange,提问作者Shlomo Aran

