Python OAuth错误“;无效授权”;
我在一家小公司工作,它的邮件是通过谷歌托管的。作为负责管理员工帐户的管理员之一,我正在尝试使用谷歌API和一个或多个专用服务帐户自动化一些任务。我在下面编写了一个简短的Python脚本,根据Google提供的文档请求访问令牌,但我仍然收到一个“invalid_grant”错误 我已经做了以下工作:Python OAuth错误“;无效授权”;,python,oauth,http-status-code-400,service-accounts,Python,Oauth,Http Status Code 400,Service Accounts,我在一家小公司工作,它的邮件是通过谷歌托管的。作为负责管理员工帐户的管理员之一,我正在尝试使用谷歌API和一个或多个专用服务帐户自动化一些任务。我在下面编写了一个简短的Python脚本,根据Google提供的文档请求访问令牌,但我仍然收到一个“invalid_grant”错误 我已经做了以下工作: <Response [400]> {u'error_description': u'Bad Request', u'error': u'invalid_grant'} 作为服务帐户登录
<Response [400]>
{u'error_description': u'Bad Request', u'error': u'invalid_grant'}
- 作为服务帐户登录到Google开发者控制台并创建了一个项目
- 已创建服务帐户类型的客户端ID
- 登录到谷歌管理控制台,添加客户端电子邮件地址和范围URL,我希望该帐户能够访问
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'}
{u'error\u description':u'Bad Request',u'error':u'invalid\u grant'}
我会查看输出的http和url以确定,但看起来您确实存在身份验证问题
我遇到了一个类似的问题,虽然不太复杂,但无法通过python脚本获得我的Google开发者证书。最后,我用我的Chrome浏览器cookies和以下脚本完成了这一部分:
让一切变得非常简单:
url = 'http://www.example.com'
s = requests.Session()
cookies = pyCookieCheat.chrome_cookies(url)
s.get(url, cookies = cookies)
我认为授权应该是授权代码或者类似的东西。看到您的授权类型是“授权类型”:“urn:ietf:params:oauth:grant-type:jwt-bearer”,这就是为什么它会出现错误的原因谢谢您的及时回复。但是,回复中包含的建议和附带链接是针对web服务器应用程序而非服务帐户的访问请求。进行建议的更改会导致脚本抛出一个不同的错误,该错误表示
{u'error\u description':u'Missing required parameter:code',u'error':u'invalid\u request'}
错误消息是我使用参数而不是数据的结果。前者用于get请求,后者用于post。但是,我现在收到一条错误消息,说明{u'error\u description':缺少u'Required参数:grant\u type',u'error':u'invalid\u request'}
。感谢您的建议和有用的信息。然而,我不认为这是一个可行的解决方案,这个特定的场景。用于此目的的帐户是一个服务帐户,将来完全可能会有服务帐户。必须与每个人一起登录到谷歌网站来创建加密的cookie,然后需要解密,这既不实用也不可扩展。如果谷歌改变了他们的cookies,正如作者在该页面上提到的,这是他的脚本的灵感来源,那么这将需要再次进行。