Spotify 的 Pythons Social Auth:重定向缺少 'state' 参数

Pythons Social Auth for Spotify: redirect is missing 'state' parameter

我正在 Django 应用程序中实施 Python 社交身份验证,需要访问用户的 Spotify 帐户。 Auth 流程的第一步是:将请求发送到 Spotify 的“/authorize”端点,并向用户显示一个模式,解释应用程序将被授权的访问范围。但是,当请求应用程序的重定向 uri 时 ('/completed/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']

这个问题可能只是我对 Auth 的一般体验的一个函数,尤其是在 Django 的上下文中。我已经阅读了 PSA 源代码的相关部分,但我不明白这个 'state' 参数是如何在 Spotify 和应用程序之间传递的。我看到此参数已添加到对 Spotify 的原始请求中,但我不确定如果还有关于 'state' 的其他考虑(例如将其存储在某处),如何确保它被传递回重定向​​ URI and/or。欢迎任何建议。

I've read through relevant parts of PSA's source code but I do not understand how this 'state' parameter gets passed around between Spotify and the app.

在 oAuth 2.0 中使用授权代码流程或隐式授权流程时,可以将可选的 state 值附加到授权 URL。如果 state 被发送到 API 提供商,它也会附加在对应用程序的响应中,作为重定向的一部分发出请求。 state 的目的是防止 Cross Site Request Forgery (CSRF) 攻击。

来自 Spotify's Authorization Guide 授权码 流程:

如图所示,状态在 #1 中发送到 Spotify 的帐户服务,并在 #3[ 中传回应用程序=39=].此时,应用程序再次检查状态值是否与 #1 期间发送的值相同。如果它不是相同的值,则有人试图直接访问应用程序的重定向 URI,而不是从 Spotify 的帐户服务重定向。

I see this param added to the original request to Spotify but I am not sure how to ensure it gets passed back to the redirect URI

鉴于您使用的是 Python Social Auth 的 0.2.10 版本,state 参数被读取 here, and the exception is raised here,因此它看起来像 state 参数永远不会传回您的应用程序。它不会被传回的唯一原因是 state 从未发送到 Spotify 的帐户服务。请调试并仔细检查 state 是响应查询参数的一部分,也是请求查询参数的一部分。如果请求有 state,响应中也应该设置 state。如果 Python Social Auth 允许您选择不使用状态,我会尝试这样做,至少是为了解决问题。