Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OAuth错误“;无效授权”;_Python_Oauth_Http Status Code 400_Service Accounts - Fatal编程技术网

Python OAuth错误“;无效授权”;

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'} 作为服务帐户登录

我在一家小公司工作,它的邮件是通过谷歌托管的。作为负责管理员工帐户的管理员之一,我正在尝试使用谷歌API和一个或多个专用服务帐户自动化一些任务。我在下面编写了一个简短的Python脚本,根据Google提供的文档请求访问令牌,但我仍然收到一个“invalid_grant”错误

我已经做了以下工作:

<Response [400]>
{u'error_description': u'Bad Request', u'error': u'invalid_grant'}
  • 作为服务帐户登录到Google开发者控制台并创建了一个项目
  • 已创建服务帐户类型的客户端ID
  • 登录到谷歌管理控制台,添加客户端电子邮件地址和范围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'}

{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,正如作者在该页面上提到的,这是他的脚本的灵感来源,那么这将需要再次进行。