通过curl获取Linkedin OAuth访问令牌,但通过urllib python无法获取
LinkedIn的API分为两个部分:第一部分是从LinkedIn获取授权码(用GET请求),第二部分是在大约10秒内使用这个授权码来获取访问令牌(用POST请求)。下面是我的示例请求:
第一部分,我可以在浏览器中成功完成,能够重定向到LinkedIn,并获取授权码。这个链接是:
https://www.linkedin.com/uas/oauth2/authorization?response_type=code&client_id=XXXXX&state=ddlkjdfkljdfkljdfk&redirect_uri=http%3A//localdev.boxuno.com%3A8888/auth/linkedinOauth1Callback第二部分,我可以使用curl成功完成,命令如下:
curl -v --data "grant_type=authorization_code&code=XXXXX&redirect_uri=http%3A//localdev.boxuno.com%3A8888/auth/linkedinOauth1Callback&client_id=XXXXX&client_secret=XXXXX" https://www.linkedin.com/uas/oauth2/accessToken
但是,如果我在Python中使用urllib来构建HTTP POST请求,就不行了:我得到了一个400错误。
response = urllib2.urlopen(urllib2.Request(url, urllib.urlencode({'code': 'XXXXX', 'grant_type':'authorization_code', 'redirect_uri': 'http%3A//localdev.boxuno.com%3A8888/auth/linkedinOauth1Callback', 'client_id': 'XXXXX', 'client_secret': 'XXXXX'})))
我确保第一步和第二步中的重定向URI是匹配的,并且我快速调用第二步(这样授权码不会过期),同时确保两个请求中的client_id也是一致的。我不明白为什么Python的版本总是失败,而curl的版本却可以成功。我还尝试明确添加下面的头部,因为curl请求中有这个,但还是不行。
"Content-Type" : "Type: application/x-www-form-urlencoded"
求助!
1 个回答
0
我做了一件傻事。我把参数同时放在了请求的主体和网址的末尾。