2017-06-03 209 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