使用 django python-social-auth 重定向后会话值丢失

Posted

技术标签:

【中文标题】使用 django python-social-auth 重定向后会话值丢失【英文标题】:Session value missing after redirect with django python-social-auth 【发布时间】:2016-10-03 16:37:59 【问题描述】:

我正在开发一个使用 python-social-auth 对 facebook 进行身份验证的 django 项目。我在 localhost 上运行 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.

【问题讨论】:

【参考方案1】:

此错误是由于会话 cookie 未通过非 https url 保存。在 django 中将 SESSION_COOKIE_SECURE 设置为 True 在 localhost 上进行测试时,会话 cookie 不会在重定向之间持续存在,并且在任何类型的页面更改中都会检查会话时会出现此错误。

SESSION_COOKIE_SECURE=False 进行测试,一切都很好

【讨论】:

你如何在生产中做到这一点? 他们没有,他们只是离职了! :) 如果您只想通过 https 连接允许会话 cookie(您可能会这样做),只需将值设置为 True 【参考方案2】:

通过从 django 设置中删除 LOGIN_REDIRECT_URL 解决了这个问题。

实际上python_social_auth管道结构将LOGIN_REDIRECT_URL设置为next,即重定向到url,但不幸的是他们没有处理命名模式。因此,当我们将 LOGIN_REDIRECT_URL 设置为 myapp:index 时,它会产生此错误。

因此,要么删除此设置,要么使用直接模式,即

LOGIN_REDIRECT_URL = myapp/index

【讨论】:

【参考方案3】:

我也有这个问题。通过在我的 settings.py 文件中添加“SOCIAL_AUTH_REDIRECT_IS_HTTPS = True”来解决它,因为我的配置是使用 nginx 重定向到 HTTPS。我只是通过阅读此处的文档找到了这个答案:https://python-social-auth-docs.readthedocs.io/en/latest/configuration/settings.html

【讨论】:

【参考方案4】:

就我而言,这与 v96 时代的浏览器将 SameSite cookie 的默认值从“None”/“–”更改为“Lax”有关,这至少会影响 HTTP 上的多站点身份验证,例如 localhost(也许不是HTTPS)。旧 django 2.1 不允许您将这些指定为“无”,因此它停止工作。

目前在 Safari 15.2 中,旧的 cookie 仍然有效。

【讨论】:

以上是关于使用 django python-social-auth 重定向后会话值丢失的主要内容,如果未能解决你的问题,请参考以下文章

django使用已有的数据库表怎么建立model

Django web 开发 - Django的使用

Django-下载安装-配置-创建django项目-三板斧简单使用

使用Django返回helloworld

使用Django返回helloworld

使用Django返回helloworld