Python-基本授权(OAuth2.0),可从API检索访问令牌

时间:2019-07-03 19:49:16

标签: python-3.x api oauth-2.0 python-requests authorization

我正在尝试使用以下必需信息从API生成访问令牌:

授权端点:https://api.paylocity.com/IdentityServer/connect/token

授权标头 该请求应采用基本身份验证请求的形式,其中“ Authorization”标头包含客户端ID和客户端秘密。这意味着标准的base-64编码的user:password,以“ Basic”作为Authorization标头的值,其中user是客户ID,密码是客户秘密。

内容类型标题 “ Content-Type”标头必须为“ application / x-www-form-urlencoded”。

其他值 该请求必须在请求正文中发布以下表单编码值:

grant_type = client_credentials scope = WebLinkAPI

我尝试使用Python'requests'软件包失败,请参见下文:

import requests

url = "https://api.paylocity.com/IdentityServer/connect/token"

headers = {
    'Authorization': "Basic **********:**********",
    'Content-Type': "application/x-www-form/urlencoded"
    }

body = {
    'grant_type': "client_credentials",
    'scope': 'WebLinkAPI'
}

response = requests.request("POST", url, headers=headers, params=body)

print(response.text)

我收到一条错误消息,而不是访问令牌:

{“错误”:“ invalid_client”}

我已经验证我的base64编码的用户名和密码正确无误,它看起来像“ G / RaNdOm:MoReRaNdOm ==”,并且当我将它们添加到邮递员时,它可以正常工作,因此我的凭据是正确的。怎么了?

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。有两个问题,授权标头未使用ASCII作为具有base64编码的目标字符集。另一个问题是尝试将附加值添加到参数中,而不是在请求包中添加正文。解决的办法是用“数据”代替“参数”。解决方法如下:

url = "https://api.paylocity.com/IdentityServer/connect/token"

body = "grant_type=client_credentials&scope=WebLinkAPI"
headers = {
    'Content-Type': "application/x-www-form-urlencoded",
    'Authorization': "Basic ***(base64ASCII)username:password***",
    }

response = requests.request("POST", url, data=body, headers=headers)

print(response.text)