【发布时间】:2018-01-27 20:15:00
【问题描述】:
我正在使用来自requests-oauthlib 的标准 oauth2 网络流示例从 QuickBooks Online 的 API 获取令牌,但是虽然我已成功重定向到 QBO 站点,但已获得授权并返回代码以请求我得到的令牌一个:
oauthlib.oauth2.rfc6749.errors.InvalidClientError
当我实际发出令牌请求时出错。 google了很多,好像我没有正确授权。 QBO 说实际请求可能如下所示:
POST https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer HTTP/1.1
Accept: application/json
Authorization: Basic UTM0dVBvRDIwanp2OUdxNXE1dmlMemppcTlwM1d2
NzRUdDNReGkwZVNTTDhFRWwxb0g6VEh0WEJlR3dheEtZSlVNaFhzeGxma1l
XaFg3ZlFlRzFtN2szTFRwbw==
Content-Type: application/x-www-form-urlencoded
Host: oauth.platform.intuit.com
Body: grant_type=authorization_code&
code=L3114709614564VSU8JSEiPkXx1xhV8D9mv4xbv6sZJycibMUI&
redirect_uri=https://www.mydemoapp.com/oauth-redirect
我需要像这样生成授权标头:
"基本" + base64encode(client_id + ":" + client_secret)
我已经像这样创建了上面的内容:
auth_code = client_id + ":" + client_secret
auth_code = base64.b64encode(bytes(auth_code, 'utf-8'))
auth_code = auth_code.decode('utf-8')
但是在令牌代码中传递它,例如:
token = qbo.fetch_token(token_url, code=code, authorization_response=redirect_uri, headers={'Authorization' : auth_code})
导致 InvalidClientError 消息。我觉得我真的很接近,但在最后的 oauth2 障碍中失败了,但是有人可以帮我授权令牌吗?
非常感谢, 约翰
----- 编辑 1 -----
感谢 stovfl,这非常有帮助,我现在根据您的建议尝试了一些新东西。我刚刚更新了代码,使其如下所示:
headers = {'Accept':'application/json'}
headers.update({'Content-Type': 'application/x-www-form-urlencoded'})
auth = HTTPBasicAuth(client_id, client_secret)
body = 'grant_type=authorization_code&code=' + code + '&redirect_uri=' + redirect_uri_token
token = qbo.fetch_token(token_url, auth=auth, body=body, headers=headers)
这又产生了一个错误:
ValueError:请提供代码或授权响应参数。
检查实际的 oauth 库代码,必须提供代码/身份验证响应,因此我再次更新以从回调中获取代码并在我的 fetch_token 请求中使用它:
all_args = request.args.to_dict()
code = all_args['code']
headers = {'Accept':'application/json'}
headers.update({'Content-Type': 'application/x-www-form-urlencoded'})
auth = HTTPBasicAuth(client_id, client_secret)
body = 'grant_type=authorization_code&code=' + code + '&redirect_uri=' + redirect_uri_token
token = qbo.fetch_token(token_url, code=code, auth=auth, body=body, headers=headers)
我也试过删除代码,只在主调用中,所以主体看起来像这样:
body = 'grant_type=authorization_code' + '&redirect_uri=' + redirect_uri_token
但无论哪种方式,它现在都会回到之前的错误:
oauthlib.oauth2.rfc6749.errors.InvalidClientError: (invalid_client)
我不知道从这里去哪里。
【问题讨论】:
标签: python api oauth-2.0 python-requests