我在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'比如把它存放在某个地方。欢迎任何建议。
答案 0 :(得分:3)
我已经阅读了PSA源代码的相关部分,但我没有 了解这个“状态”参数如何在两者之间传递 Spotify和应用程序。
在oAuth 2.0中使用授权代码流或隐式授权流时,可以将可选的state
值附加到授权URL。如果将state
发送给API提供程序,则它还会附加到对应用程序的响应中,从而将请求作为重定向的一部分。 state
的目的是防止Cross Site Request Forgery(CSRF)攻击。
来自Spotify's Authorization Guide的授权码流程:
正如您在图片中看到的那样,状态将通过#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允许您选择退出使用状态,我会尝试至少进行故障排除。