Python 使用urllib2进行简单https身份验证时遇到问题(获取PayPal OAUTH承载令牌)

Python 使用urllib2进行简单https身份验证时遇到问题(获取PayPal OAUTH承载令牌),python,oauth-2.0,paypal,urllib2,Python,Oauth 2.0,Paypal,Urllib2,我正处于将我们的web应用程序与PayPal的express checkout api集成的第一阶段。对于我来说,购买时,我必须使用我们的客户id和客户机密获得一个不记名代币 我使用以下curl命令成功获取该令牌: curl https://api.sandbox.paypal.com/v1/oauth2/token \ -H "Accept: application/json" \ -H "Accept-Language: en_US" \ -u "ourID:ourSecret" \ -d

我正处于将我们的web应用程序与PayPal的express checkout api集成的第一阶段。对于我来说,购买时,我必须使用我们的客户id和客户机密获得一个不记名代币

我使用以下curl命令成功获取该令牌:

curl https://api.sandbox.paypal.com/v1/oauth2/token \
-H "Accept: application/json" \
-H "Accept-Language: en_US" \
-u "ourID:ourSecret" \
-d "grant_type=client_credentials"
现在,我正在尝试使用urllib2在python中实现相同的结果。我得到了下面的代码,它生成了一个401HTTP未经授权的异常

    import urllib
    import urllib2

    url = "https://api.sandbox.paypal.com/v1/oauth2/token"

    PAYPAL_CLIENT_ID = "ourID"
    PAYPAL_CLIENT_SECRET = "ourSecret"

    passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
    passman.add_password(None, url, PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET)
    authhandler = urllib2.HTTPBasicAuthHandler(passman)
    opener = urllib2.build_opener(authhandler)
    urllib2.install_opener(opener)

    req = urllib2.Request( url=url,
      headers={
            "Accept": "application/json",
            "Accept-Language": "en_US",
            },
      data =urllib.urlencode({
            "grant_type":"client_credentials",
            }),)

    result = urllib2.urlopen(req).read()
    print result

有人知道我做错了什么吗?非常感谢您在这里遇到相同问题的任何见解。基于工作python的代码是:

import urllib
import urllib2
import base64
token_url = 'https://api.sandbox.paypal.com/v1/oauth2/token'
client_id = '.....'
client_secret = '....'

credentials = "%s:%s" % (client_id, client_secret)
encode_credential = base64.b64encode(credentials.encode('utf-8')).decode('utf-8').replace("\n", "")

header_params = {
    "Authorization": ("Basic %s" % encode_credential),
    "Content-Type": "application/x-www-form-urlencoded",
    "Accept": "application/json"
}
param = {
    'grant_type': 'client_credentials',
}
data = urllib.urlencode(param)

request = urllib2.Request(token_url, data, header_params)
response = urllib2.urlopen(request).open()
print response
我相信,原因已在

根据HTTP标准,Python库首先发送未经验证的请求,然后只有在401重试的情况下才发送正确的凭据。如果服务器不执行“完全标准的身份验证”,那么库将无法工作


最后让步,并使用sdk PayPal推荐()获取令牌。。。这似乎奏效了。但我还是想知道我做错了什么,如果有人有线索的话。非常感谢。