2017-06-03 212 views
1

我正在使用linkedin身份验证api登录我的网站用户。Linkedin身份验证无效redirect_uri

首先我重定向到以下网址的:

https://www.linkedin.com/oauth/v2/authorization?' \ 
     'response_type=code' \ 
     '&client_id=*****' \ 
     '&redirect_uri=http%3A%2F%2F127.0.0.1%3A8000%2Faccounts%2Flinkedin%2Fcallback%3Fnext%3D%2Fhome' \ 
     '&state=123456789' \ 
     '&scope=r_basicprofile%20r_emailaddress' 

这成功地重定向到LinkedIn身份验证对话框。在接受授予linkedin应用程序用户权限后,成功地将它重定向到redirect_uri,并附加code param。

之后我发送POST请求喜欢如下:

requests.post(
    'https://www.linkedin.com/oauth/v2/accessToken', 
    data={ 
     'grant_type': 'authorization_code', 
     'code': returned code in previous step, 
     'redirect_uri': 'http%3A%2F%2F127.0.0.1%3A8000%2Faccounts%2Flinkedin%2Fcallback%3Fnext%3D%2Fhome', 
     'client_id': ****, 
     'client_secret': settings.LINKEDIN_CLIENT_SECRET, 
    } 
) 

但这一要求并不成功,我不知道为什么!以下是LinkedIn返回的响应:

{'error': 'invalid_redirect_uri', 'error_description': 'Unable to retrieve access token: appid or redirect uri or code verifier does not match authorization code or authorization code expired'} 

正如你看到REDIRECT_URI在两个相同的请求......

+0

交换授权代码的访问令牌通常在没有REDIRECT_URI完成。 (虽然我不知道linkedin是否属于这种情况。)如果您不发送redirect_uri,它会工作吗? –

+0

是的,它需要根据LinkedIn资料 – mohammad

回答

3

在你的令牌请求您在POST提供重定向的URI的URL编码值数据,但requests.post将自动对data对象中的键/值对进行网址编码。因此,该值到达服务器双重编码,因此不会与授权请求中发送的原始值相匹配;服务器响应invalid_redirect_uri

你需要发送

'redirect_uri': 'http://127.0.0.1:8000/accounts/linkedin/callback?next=/home', 
+0

非常感谢汉克斯 – mohammad

+0

@Hans Z是反正有做AJAX POST方法类似 $阿贾克斯({\t \t \t \t URL来实现这一目标:的“https://www.linkedin。 com/oauth/v2/accessToken/grant_type = authorization_code&code ='+ accesscode +'&redirect_uri = http://localhost/workout/linkedin.html&client_id=xxx&client_secret=xxx', 方法:'POST', 标题:{ContentType:'application/X WWW的窗体-urlencoded'}, \t成功:函数(RESP){ \t \t \t的console.log(RESP); } }); – Sankar