如何通过服务账号JSON生成Google Business API调用所需的Access Token?
我完全理解你的困惑——拿着服务账号的JSON文件,本以为调用generateAccessToken接口就能直接生成token,结果却碰到了认证错误。其实这个错误逻辑是通顺的:调用iamcredentials.googleapis.com的接口本身也需要身份认证,你得先通过服务账号的私钥完成身份校验,才能请求生成针对Google Business API的access token。
下面给你两种可行的解决方案,优先推荐官方客户端库的方式,它能帮你省去手动处理加密、签名的繁琐细节:
方法一:使用Google官方客户端库(推荐)
以Python为例,借助google-auth系列库可以轻松搞定整个流程:
- 先安装依赖包:
pip install google-auth google-auth-httplib2
- 编写代码加载服务账号并生成token:
from google.oauth2 import service_account import google.auth.transport.requests # 替换为你的服务账号JSON文件路径 SERVICE_ACCOUNT_PATH = "/path/to/your/service-account.json" # Google Business API所需的权限范围 API_SCOPES = ["https://www.googleapis.com/auth/business.manage"] # 加载服务账号凭证 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_PATH, scopes=API_SCOPES ) # 刷新/获取有效access token(首次调用会自动生成) request = google.auth.transport.requests.Request() credentials.refresh(request) # 拿到可用的access token access_token = credentials.token print(f"生成的Access Token: {access_token}")
这个方法会自动处理JWT签名、向Google认证服务器请求token的全流程,你不用手动调用iamcredentials接口,直接就能拿到符合需求的access token。
方法二:手动生成JWT并换取Access Token
如果你不想依赖客户端库,可以手动完成以下步骤:
提取服务账号关键信息:从JSON文件中获取
private_key、client_email、token_uri(默认是https://oauth2.googleapis.com/token)。构造JWT内容:
- 头部(Header):指定加密算法和类型:
{"alg": "RS256", "typ": "JWT"} - 载荷(Payload):必须包含以下字段:
iss:服务账号的client_emailscope:权限范围,填https://www.googleapis.com/auth/business.manageaud:token接收地址,即https://oauth2.googleapis.com/tokenexp:过期时间戳(当前时间+3600秒,最长不超过3600秒)iat:签发时间戳(当前时间)
- 头部(Header):指定加密算法和类型:
用私钥签名JWT:将Header和Payload分别做Base64URL编码后拼接,再用服务账号的
private_key以RS256算法签名,得到完整的JWT字符串。请求Access Token:向
https://oauth2.googleapis.com/token发送POST请求,参数如下:grant_type:固定值urn:ietf:params:oauth:grant-type:jwt-bearerassertion:你生成的签名后的JWT
curl示例:
curl -X POST https://oauth2.googleapis.com/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=YOUR_SIGNED_JWT_STRING"
成功响应会返回包含access_token的JSON数据。
关键注意事项
- 服务账号授权:必须把服务账号的邮箱添加到对应的Google Business账号中,授予它管理员权限或至少拥有评论管理的权限。否则就算拿到token,调用Reviews接口时会返回权限不足的错误。
- 权限范围校验:确保请求的scope是
https://www.googleapis.com/auth/business.manage,这个权限足够访问Reviews接口。
内容的提问来源于stack exchange,提问作者Carlos Pérez

