Django Python-social-auth重定向后会话值丢失

6
我正在使用python-social-auth在django项目中进行Facebook身份验证。我在本地主机上运行django服务器,并已经为我的应用程序设置了Facebook,以重定向到http://127.0.0.1:8000/complete/facebook/,这将开始python-social-auth的管道来验证用户。我正在使用postgres作为我的数据库。
当调用此方法并尝试进行身份验证时,它无法找到有关会话的信息。根据https://github.com/omab/python-social-auth/issues/534,我认为sessionid cookie被覆盖了。如果我将Facebook重定向发送到不同的URL以加载没有身份验证的静态页面,则没有错误,但我也没有进行身份验证或从Facebook获取任何信息。
如果这是实际问题,我该如何避免覆盖sessionid cookie,还是我可能会忽略其他问题?
[03/Jun/2016 05:19:58] "GET /login/facebook/?next=/lithium-web/ HTTP/1.1" 302 0
Internal Server Error: /complete/facebook/
Traceback (most recent call last):
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/django/views/decorators/cache.py", line 57, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/social/apps/django_app/utils.py", line 51, in wrapper
    return func(request, backend, *args, **kwargs)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/social/apps/django_app/views.py", line 28, in complete
    redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/social/actions.py", line 43, in do_complete
    user = backend.complete(user=user, *args, **kwargs)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/social/backends/base.py", line 41, in complete
    return self.auth_complete(*args, **kwargs)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/social/utils.py", line 229, in wrapper
    return func(*args, **kwargs)
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/social/backends/facebook.py", line 71, in auth_complete
    state = self.validate_state()
  File "/Users/mac/Desktop/lithium-web/lib/python2.7/site-packages/social/backends/oauth.py", line 88, in validate_state
    raise AuthStateMissing(self, 'state')
AuthStateMissing: Session value state missing.
5个回答

7

这个错误是由于在非https网址上没有保存session cookie导致的。在使用django进行本地测试时,如果将SESSION_COOKIE_SECURE设置为True,则会发生重定向后session cookie不会持久化的问题,并且在检查session的任何页面更改中都会出现此错误。

在测试时可以将SESSION_COOKIE_SECURE设置为False,这样就不会出现这个错误了。


你如何在生产环境中实现它? - dietbacon
2
他们没有解释,只是辞职了! :) - phaazon
如果您只想允许通过 HTTPS 连接使用会话 cookie(这很可能是您想要的),请将值设置为 True。 - dan arters
这个不起作用。 - Khris Vandal

0

0
通过从Django设置中删除LOGIN_REDIRECT_URL解决了这个问题。
实际上,python_social_auth管道结构将LOGIN_REDIRECT_URL设置为next,即重定向到URL,但不幸的是,他们没有处理命名模式。因此,当我们将LOGIN_REDIRECT_URL设置为myapp:index时,会产生此错误。
因此,要么删除此设置,要么使用直接模式,即 LOGIN_REDIRECT_URL = myapp/index

0
在我的情况下,这与v96时代的浏览器将SameSite Cookie的默认值从“None”/“-”更改为“Lax”有关,至少会影响HTTP上的多站点身份验证,如localhost(可能不包括HTTPS)。旧版本的django 2.1不允许您将其指定为“None”,因此它停止工作了。
目前,在Safari 15.2中,旧版Cookie仍然有效。

0

在测试时可以模拟它。如果我们移除/不包含这里显示的会话设置

def setUp(self):
    session = self.client.session
    session['facebook_state'] = '1'
    session.save()

那么你就能够得到相同的错误

social_core.exceptions.AuthStateMissing: 会话值状态丢失。


发现也有其他人遇到了这个问题

总的来说,以下内容的添加解决了这个问题(仅在开发环境中使用)settings.py

SOCIAL_AUTH_REDIRECT_IS_HTTPS = True
SESSION_COOKIE_SAMESITE = None
SESSION_COOKIE_HTTPONLY = False
SOCIAL_AUTH_FIELDS_STORED_IN_SESSION = ['facebook_state']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接