我在一家通过 Google 托管邮件的小公司工作。作为负责管理员工帐户的管理员之一,我正在尝试使用 Google API 和一个或多个专用服务帐户自动执行一些任务。我根据 Google 提供的文档编写了下面的简短 Python 脚本来请求访问令牌,但我继续收到“invalid_grant”错误。
我做了以下事情:
- 以服务帐号身份登录 Google Developers Console 并创建项目
- 创建了服务帐户类型的客户端 ID
- 登录到 Google 管理控制台并添加了我希望帐户有权访问的客户电子邮件地址和范围 URL
在线搜索得到的答案表明机器的系统时间已关闭、已超出刷新令牌的限制或已使用客户端 ID 而不是客户端电子邮件。在运行脚本之前,我已经在 Windows 机器和 Linux 机器上同步了时间,并且出现了同样的错误。我什至没有获得访问令牌,所以我怀疑是否超出了刷新限制。如下所示,iss 值设置为以“@developer.gserviceaccount.com”结尾的客户端电子邮件地址。
我怀疑我还缺少其他东西,而且由于我是 Python 新手,所以我怀疑这是一件简单得令人尴尬的事情。也许有人可以提供帮助?
import json
import time
import base64
import requests
from datetime import datetime
utc = datetime.utcnow()
iat = time.mktime(utc.timetuple())
exp = iat + 3600
jwt_header = {
"alg":"RS256",
"typ":"JWT"
}
jwt_claim_set = {
"iss":"pleasehelpme@developer.gserviceaccount.com",
"scope":"https://www.googleapis.com/auth/admin.directory.user",
"aud":"https://www.googleapis.com/oauth2/v3/token",
"iat":int(iat),
"exp":int(exp),
"sub":"someadminfrustrated@googleoauth.com"
}
jwt_jws = bytearray(str(jwt_header) + '.' + str(jwt_claim_set))
jwt_unencoded = str(jwt_header) + '.' + str(jwt_claim_set) + '.' + str(jwt_jws)
jwt_encoded = base64.urlsafe_b64encode(str(jwt_unencoded))
url = 'https://www.googleapis.com/oauth2/v3/token'
headers = {
'content-type': 'application/x-www-form-urlencoded'
}
payload = {
'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion': jwt_encoded
}
response = requests.post(url, headers=headers, params=payload)
print response
print response.json()
输出如下:
<Response [400]>
{u'error_description': u'Bad Request', u'error': u'invalid_grant'}