如何将旧版FCM HTTP请求迁移至HTTP V1协议?非Google服务器环境下如何获取FCM V1授权令牌?
解决非Google平台服务器的FCM V1协议授权问题
Hey there! 针对你在非Google平台服务器上迁移FCM到V1协议的授权困惑,我给你整理了两种最适配的方案,完全不需要依赖Google云运行环境:
方案1:使用服务账户JSON文件(推荐,实现简单)
这是最省心的方式,借助Firebase Admin SDK可以自动处理令牌的获取和刷新,不用手动拼接授权头:
获取服务账户JSON文件
打开你的Firebase控制台 → 进入项目设置 → 切换到「服务账户」标签页 → 点击「生成新的私钥」,下载JSON文件后,把它放到服务器的安全目录下(绝对不要提交到公共代码仓库)。用Admin SDK初始化授权
根据你服务器的编程语言,引入Firebase Admin SDK并初始化,SDK会自动读取JSON文件完成授权:
示例(Java):FileInputStream serviceAccount = new FileInputStream("/path/to/your-service-account.json"); FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .build(); FirebaseApp.initializeApp(options);初始化完成后,你调用SDK的FCM发送接口时,它会自动带上有效的
Authorization: Bearer <token>头,完全不用你手动处理令牌。
方案2:手动生成短期OAuth 2.0访问令牌
如果不想依赖Admin SDK,想自己处理HTTP请求,可以手动生成令牌:
准备服务账户信息
同样先获取服务账户JSON文件,提取里面的client_email(服务账户邮箱)和private_key(RSA私钥)。创建并签名JWT
构造一个JWT payload,包含以下必填字段:iss: 服务账户的client_emailscope:https://www.googleapis.com/auth/firebase.messaging(FCM的授权范围)aud:https://oauth2.googleapis.com/token(令牌请求的端点)exp: 当前时间戳 + 3600(令牌有效期最多1小时)iat: 当前时间戳
用JSON文件里的private_key以RS256算法对JWT进行签名。
请求访问令牌
向https://oauth2.googleapis.com/token发送POST请求,参数如下:grant_type:urn:ietf:params:oauth:grant-type:jwt-bearerassertion: 签名后的完整JWT字符串
响应会返回access_token字段,这个就是你需要的Bearer令牌,直接拼接成Authorization: Bearer <access_token>即可用于FCM V1请求。注意令牌1小时后过期,需要定时重新生成。
注意事项
- 务必保证服务账户JSON文件的安全性,一旦泄露,攻击者可以冒充你的服务器发送通知给用户。
- 优先选择方案1,Admin SDK不仅简化了授权流程,还会自动处理令牌刷新、错误重试等细节,减少运维成本。
- 测试时可以用curl发送测试请求验证令牌有效性,比如:
curl -X POST "https://fcm.googleapis.com/v1/projects/your-project-id/messages:send" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "message": { "token": "USER_DEVICE_TOKEN", "notification": { "title": "Test", "body": "Hello from FCM V1" } } }'
内容的提问来源于stack exchange,提问作者FractalBob
相关产品推荐
相关产品推荐

