如何通过纯REST调用获取OAuth2授权码以实现Firebase推送通知?
无需用户交互获取FCM OAuth2令牌的REST方案(Postman实现)
你要的纯REST无跳转获取令牌的方案,只能用Google服务账号的JWT授权流程——授权码流程必须依赖用户登录跳转,没法满足你的需求。以下是具体操作步骤:
1. 准备服务账号密钥
- 登录Google Cloud控制台,找到你的Firebase关联项目
- 进入「IAM与管理」→「服务账号」页面,创建或选择一个现有服务账号
- 给该服务账号分配「Firebase Messaging Admin」角色(确保有发送FCM通知的权限)
- 点击服务账号→「密钥」→「添加密钥」→「创建新密钥」,选择JSON格式,下载保存密钥文件
密钥文件里会包含client_email(服务账号邮箱)、private_key(用于签名的私钥)等核心信息,后面会用到。
2. 生成JWT令牌(Postman内完成)
JWT由Header、Payload、签名三部分组成,你可以在Postman的Pre-request Script里用代码生成,避免手动构造出错:
Postman脚本示例:
// 从密钥文件提取的信息 const clientEmail = "你的服务账号邮箱@xxx.iam.gserviceaccount.com"; const privateKey = `-----BEGIN PRIVATE KEY----- 你的私钥内容 -----END PRIVATE KEY-----`; const scope = "https://www.googleapis.com/auth/firebase.messaging"; // 构造Header和Payload const header = { alg: "RS256", typ: "JWT" }; const now = Math.floor(Date.now() / 1000); const payload = { iss: clientEmail, scope: scope, aud: "https://oauth2.googleapis.com/token", exp: now + 3600, // 1小时过期 iat: now }; // 编码Header和Payload为Base64URL格式 function base64urlEncode(str) { return btoa(JSON.stringify(str)) .replace(/\+/g, "-") .replace(/\//g, "_") .replace(/=+$/, ""); } const encodedHeader = base64urlEncode(header); const encodedPayload = base64urlEncode(payload); // 用私钥签名生成JWT const signature = pm.crypto.rsa.sign(encodedHeader + "." + encodedPayload, privateKey, "SHA-256"); const jwt = encodedHeader + "." + encodedPayload + "." + signature; // 把JWT存入Postman变量,供后续请求调用 pm.variables.set("jwt_token", jwt);
3. 请求获取访问令牌
- 新建Postman请求,方法为
POST,URL为https://oauth2.googleapis.com/token - 请求体选择
x-www-form-urlencoded,添加以下参数:grant_type:值为urn:ietf:params:oauth:grant-type:jwt-bearerassertion:值为{{jwt_token}}(刚才脚本生成的JWT变量)
- 发送请求,响应会返回
access_token,这就是调用FCM API需要的OAuth2令牌
4. 调用FCM发送通知
- 新建Postman请求,方法
POST,URL为https://fcm.googleapis.com/v1/projects/你的项目ID/messages:send - 请求头添加
Authorization: Bearer {{access_token}}(把上一步拿到的令牌存入Postman变量) - 请求体选择
raw→JSON,填入FCM消息格式,示例:
{ "message": { "token": "目标设备的推送令牌", "notification": { "title": "测试通知", "body": "这是一条通过REST调用发送的FCM通知" } } }
发送请求即可完成推送。
内容的提问来源于stack exchange,提问作者user829364
相关产品推荐
相关产品推荐

