用于 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 登录”身份验证系统?

Azure 应用服务:自定义身份验证和社交提供程序

如何使用分离的后端和前端(Passport / Express / React)进行社交身份验证

使用 Python 进行 Spotify API 身份验证

如何在我当前使用 Spotify Search API 的代码上应用 Spotify API 身份验证?