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

时间:2015-06-04 00:59:17

标签: python django oauth-2.0 spotify python-social-auth

我在Django应用程序中实现Python Social Auth,需要访问用户的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源代码的相关部分,但我不明白这个'是什么状态'参数在Spotify和应用程序之间传递。我看到这个参数添加到Spotify的原始请求中,但我不确定如何确保它被传递回重定向​​URI和/或是否有其他关于' state'比如把它存放在某个地方。欢迎任何建议。

1 个答案:

答案 0 :(得分:3)

  

我已经阅读了PSA源代码的相关部分,但我没有   了解这个“状态”参数如何在两者之间传递   Spotify和应用程序。

在oAuth 2.0中使用授权代码流或隐式授权流时,可以将可选的state值附加到授权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的帐户服务重定向。

  

我看到这个参数添加到Spotify的原始请求中,但我是   不确定如何确保它被传递回重定向​​URI

鉴于您使用的是Python Social Auth的0.2.10版本,state参数读取为here,异常被引发here,因此它看起来像{ {1}}参数永远不会传递回您的应用程序。它不会被传回的唯一原因是state从未发送到Spotify的帐户服务。请调试并仔细检查state是否为响应查询参数的一部分,以及它是请求查询参数的一部分。如果请求包含state,则响应中也应设置state。如果Python Social Auth允许您选择退出使用状态,我会尝试至少进行故障排除。