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 允许您选择不使用状态,我会尝试这样做,至少是为了解决问题。
我正在 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 允许您选择不使用状态,我会尝试这样做,至少是为了解决问题。