用于 Spotify 的 Python 社交身份验证:重定向缺少“状态”参数
Posted
技术标签:
【中文标题】用于 Spotify 的 Python 社交身份验证:重定向缺少“状态”参数【英文标题】:Pythons Social Auth for Spotify: redirect is missing 'state' parameter 【发布时间】:2015-08-18 10:36:12 【问题描述】:我正在一个需要访问用户 Spotify 帐户的 Django 应用程序中实现 Python Social Auth。 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 源代码的相关部分,但我不明白这个“状态”参数是如何在 Spotify 和应用程序之间传递的。我看到此参数已添加到对 Spotify 的原始请求中,但我不确定如何确保将其传递回重定向 URI 和/或是否还有其他关于“状态”的考虑,例如将其存储在某处。欢迎任何建议。
【问题讨论】:
你能发布你的管道吗? 【参考方案1】:我已经阅读了 PSA 源代码的相关部分,但我没有 了解这个“状态”参数是如何在之间传递的 Spotify 和应用程序。
在 oAuth 2.0 中使用授权代码流程或隐式授权流程时,可以将可选的 state
值附加到授权 URL。如果将 state
发送到 API 提供程序,它还会附加在对发出请求的应用程序的响应中,作为重定向的一部分。 state
的目的是防止Cross Site Request Forgery (CSRF) 攻击。
来自Spotify's Authorization Guide 授权码流程:
如图所示,状态在 #1 中被发送到 Spotify 的 Accounts Service,并在 #3 中传递回应用程序。此时,应用程序再次检查状态是否与 #1 期间发送的值相同。如果它不是相同的值,则有人试图直接访问应用程序的重定向 URI,而不是从 Spotify 的帐户服务重定向。
我看到此参数已添加到对 Spotify 的原始请求中,但我是 不知道如何确保它被传递回重定向 URI
鉴于您使用的是 Python Social Auth 的 0.2.10 版本,state
参数被读取为here,并引发异常here,因此看起来state
参数从未传递回到您的应用程序。它不会被传回的唯一原因是 state
从未发送到 Spotify 的帐户服务。请调试并仔细检查state
是响应查询参数的一部分,也是请求查询参数的一部分。如果请求具有state
,则响应中也应该设置state
。如果 Python Social Auth 允许您选择不使用状态,我会尝试至少进行故障排除。
【讨论】:
非常感谢。这帮助我进行了故障排除,但更重要的是,帮助我了解了身份验证流程中发生的情况。实际的异常似乎是由于我错误地定义了一个名为 LOGIN_REDIRECT_URL 的设置,并导致在 Spotify 向我已经定义的重定向 uri 发出请求后触发第二次重定向。这个答案帮助我发现了那个错误,所以它是可以接受的。再次感谢。以上是关于用于 Spotify 的 Python 社交身份验证:重定向缺少“状态”参数的主要内容,如果未能解决你的问题,请参考以下文章
用于登录 Facebook 的 Python 社交身份验证无法在生产服务器上运行
如何使用 Firebase 进行“使用 Spotify 登录”身份验证系统?