如何不依赖Google Auth Library,用service-account.json调用Firebase HTTP v1 API
无需Google Auth Library,用服务账号直接调用Firebase Cloud Messaging HTTP v1 API
当然可以只用service-account-file.json的内容实现,你之前走的是面向用户的授权码流(需要同意页面),但服务账号应该用服务器到服务器的JWT签名流,完全不需要用户交互,自然绕开同意页面。
核心逻辑步骤
服务账号的认证本质是通过自己的私钥签名生成JWT,再用这个JWT换取访问令牌,之后就能调用FCM API。具体分四步:
提取服务账号关键信息
从你的service-account-file.json里取出三个核心字段:client_email:服务账号邮箱private_key:RSA私钥(注意保留开头的-----BEGIN PRIVATE KEY-----和结尾的-----END PRIVATE KEY-----)token_uri:固定为https://oauth2.googleapis.com/token(一般json里已经有)
构造JWT令牌
JWT由三部分组成:头部、载荷、签名,用.拼接:- 头部:固定结构,声明签名算法
{"alg": "RS256", "typ": "JWT"} - 载荷:包含认证必要信息,必须填以下字段:
iss:填client_emailscope:填https://www.googleapis.com/auth/firebase.messaging(FCM API的权限范围)aud:填token_uri的值exp:过期时间戳(当前时间+3600秒,最长不能超过3600秒)iat:当前时间戳
- 签名:用
private_key对Base64URL(头部).Base64URL(载荷)进行RS256签名,结果再转成Base64URL格式
- 头部:固定结构,声明签名算法
换取访问令牌
向token_uri发送POST请求:- 请求头:
Content-Type: application/x-www-form-urlencoded - 请求体:
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=你的完整JWT字符串
成功响应会返回
access_token(有效期1小时),后续调用FCM API就用这个令牌。- 请求头:
调用FCM HTTP v1 API发送通知
向https://fcm.googleapis.com/v1/projects/你的项目ID/messages:send发送POST请求:- 请求头:
Authorization: Bearer 你的access_token Content-Type: application/json - 请求体:按FCM v1要求构造消息内容,比如:
{ "message": { "token": "目标设备的FCM令牌", "notification": { "title": "测试通知", "body": "这是一条不用Auth Library的FCM通知" } } }
- 请求头:
注意事项
- JWT的Base64URL编码要去掉
=填充,替换+为-、/为_ - 私钥签名的时候要注意格式,不要去掉首尾的标识行,有些工具需要处理换行符(比如把
\n转成实际换行) - 访问令牌过期后,重新用JWT换取即可,不需要重复走任何用户交互流程
内容的提问来源于stack exchange,提问作者alex01011
相关产品推荐
相关产品推荐

