如何在NodeJS中不使用Google SDK获取Google服务账号的Bearer Token
实现方案:手动完成谷歌服务账号JWT授权流程
不需要依赖Google官方SDK,你可以直接按服务账号OAuth 2.0标准流程生成并交换JWT拿到Bearer Token,整个流程只需要通用的JWT库和HTTP客户端即可完成,不需要做URL到服务SDK的映射。
前置依赖
仅需要引入2个通用能力,无需谷歌相关SDK:
- 任意语言的JWT签名库(支持RS256算法即可)
- 通用HTTP POST客户端
具体实现步骤
步骤1:构造JWT头
固定格式如下,仅需替换密钥对应字段:
{ "alg": "RS256", "typ": "JWT", "kid": "服务账号密钥中的private_key_id值" }
步骤2:构造JWT负载
负载字段取值规则如下:
| 字段 | 取值说明 |
|---|---|
| iss | 直接填服务账号密钥中的client_email值 |
| scope | 可直接填https://www.googleapis.com/auth/cloud-platform(全量云服务权限,无需绑定具体服务,也可根据调用的API缩小权限范围) |
| aud | 固定填https://oauth2.googleapis.com/token |
| exp | 过期时间,取当前Unix时间戳+3600(最长有效期1小时) |
| iat | 当前Unix时间戳 |
示例负载:
{ "iss": "sa@sa12345-12345.iam.gserviceaccount.com", "scope": "https://www.googleapis.com/auth/cloud-platform", "aud": "https://oauth2.googleapis.com/token", "exp": 1710000000, "iat": 1709996400 }
步骤3:签名生成JWT字符串
用服务账号密钥中的private_key值作为签名密钥,用RS256算法对上述头和负载进行签名,得到完整的JWT字符串(格式为[base64编码的头].[base64编码的负载].[签名串])。
步骤4:向谷歌OAuth接口交换Bearer Token
发送POST请求到https://oauth2.googleapis.com/token,请求头Content-Type设为application/x-www-form-urlencoded,请求体携带以下参数:
- grant_type:固定值
urn:ietf:params:oauth:grant-type:jwt-bearer - assertion:填上一步生成的完整JWT字符串
示例curl请求:
curl --request POST \ --url https://oauth2.googleapis.com/token \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data 'grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=你的JWT字符串'
接口返回内容中的access_token字段就是你需要的Authorization Bearer Token,有效期1小时,过期后重复上述流程重新生成即可。
使用说明
拿到Token后,直接在调用目标REST API的请求头中添加Authorization: Bearer 你的access_token即可,只要scope权限足够就可以正常调用任意谷歌云服务API,完全不需要做URL到SDK的映射。
内容的提问来源于stack exchange,提问作者delucaezequiel
相关产品推荐
相关产品推荐

