2015-06-04 55 views
1

我在需要訪問用戶的Spotify帳戶的Django應用中實現Python Social Auth。 Auth流程中的初始步驟起作用:向Spotify的「/ authorize」端點發送請求,並向用戶呈現解釋該應用程序將被授權訪問的範圍的模式。但是,那麼當請求應用程序的重定向URI(「/完成/ Spotify的/」),引發此異常:Pythons社交認證Spotify:重定向缺少「狀態」參數

AuthMissingParameter at /complete/spotify/ 
Missing needed parameter state 
Request Method: GET 
Request URL: http://127.0.0.1:8000/complete/spotify/ 
Django Version: 1.8.2 
Exception Type: AuthMissingParameter 
Exception Value:  
Missing needed parameter state 
Exception Location: /Users/brandon/Envs/group_playlist_generator/lib/python2.7/site-packages/social/backends/oauth.py in validate_state, line 86 
Python Executable: /Users/brandon/Envs/group_playlist_generator/bin/python 
Python Version: 2.7.9 
Python Path:  
['/Users/brandon/dev/group_playlist_generator', 
'/Users/brandon/Envs/group_playlist_generator/lib/python27.zip', 
'/Users/brandon/Envs/group_playlist_generator/lib/python2.7', 
'/Users/brandon/Envs/group_playlist_generator/lib/python2.7/plat-darwin', 
'/Users/brandon/Envs/group_playlist_generator/lib/python2.7/plat-mac', 
'/Users/brandon/Envs/group_playlist_generator/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Users/brandon/Envs/group_playlist_generator/lib/python2.7/lib-tk', 
'/Users/brandon/Envs/group_playlist_generator/lib/python2.7/lib-old', 
'/Users/brandon/Envs/group_playlist_generator/lib/python2.7/lib-dynload', 
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7', 
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', 
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', 
'/usr/local/Cellar/python/2.7.9/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', 
'/Users/brandon/Envs/group_playlist_generator/lib/python2.7/site-packages'] 

這個問題可能只是我的驗證的一般經驗的功能尤其是在上下文Django的。我已經閱讀了PSA的源代碼的相關部分,但我不明白這個'狀態'參數如何在Spotify和應用程序之間傳遞。我發現這個參數添加到Spotify的原始請求中,但我不確定如何確保它返回到重定向URI和/或是否存在有關「狀態」的其他注意事項,如將其存儲在某處。任何建議是受歡迎的。

+0

你可以發佈你的管道嗎? –

回答

3

我已經通過PSA的源代碼有關部分閱讀,但我不 理解這個「國家」參數會 Spotify和應用程序之間傳來傳去。

當使用的OAuth 2.0授權碼流或隱格蘭特流動,任選state值可以被附加到在authorize URL。如果將state發送給API提供程序,則它也附加在作爲重定向一部分的請求的應用程序的響應中。 state的目的是防止Cross Site Request Forgery(CSRF)攻擊。

Spotify's Authorization Guide授權碼流量:

Authorization Code flow and Spotify's Web API

正如你可以在圖片中看到,國家在#1發送到Spotify的賬戶服務,並通過迴應用於#3。此時,應用程序會重複檢查該狀態是否與#1期間發送的值相同。如果它不是相同的值,則有人嘗試直接訪問應用程序的重定向URI,而不是從Spotify的帳戶服務重定向。

我看到這個PARAM加入到原始請求Spotify的,但我 不知道如何確保它被傳遞迴重定向​​URI

鑑於你在0.2.10版本的Python Social Auth,state參數被讀爲here,並且引發異常here,因此看起來state參數永遠不會傳回給您的應用程序。它不會被傳回的唯一原因是state從未被髮送到Spotify的帳戶服務。請調試並仔細檢查state是響應查詢參數的一部分,並且它也是請求查詢參數的一部分。如果請求有state,那麼應答中也應該有一個state。如果Python社交身份驗證允許您選擇退出使用狀態,那麼我至少會嘗試解決問題。

+0

非常感謝。這幫助我排除了故障,但更重要的是,幫助我瞭解了Auth流程中發生的情況。實際的異常似乎是由於我錯誤地定義了名爲LOGIN_REDIRECT_URL的設置並導致在Spotify向我已定義的重定向URI發出請求之後觸發第二次重定向。這個答案幫助我發現了這個錯誤,所以它可以接受。再次感謝。 –