【问题标题】:Django cookies not working on Minikube at .local domainDjango cookie 在 .local 域的 Minikube 上不起作用
【发布时间】:2021-02-02 13:00:31
【问题描述】:

我在 Django 上有一个 web 应用程序,简单的身份验证如下:

# in a request handler
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
    login(request, user)
    return redirect('/')

该应用程序可以在 localhost 和真实服务器上通过 HTTPS 在my-app.com 上正常运行(当然不是真实域)。现在我试图让它在 Kubernetes 和 Minikube 上运行。我已经设置了一个部署,服务,NginX-Ingress,我在我的/etc/hosts文件中指定minikube ipmy-app.local,我可以使用Chrome浏览器访问它,但是身份验证不起作用!浏览器不保存 cookie,我总是被重定向到登录页面。

我找不到任何原因:我检查了服务器日志和浏览器网络跟踪,它们看起来很好,我还使用curl比较了真实的.com版本的应用程序和我的minikube/@的身份验证方法结果987654330@ 版本,它们几乎相同,我在任何地方都看到正确的Set-Cookie: ...,但是 cookie 没有保存在浏览器中。这个问题的原因是什么??

更新

我已将本地域更改为 test.my-app.com,但没有任何改进 :(

更新 2

我关闭了 Ingress,所以它与问题无关。

此外,我在我的 Django 应用程序中添加了中间件来记录每个请求的 cookie,并且我还编写了一个脚本来检查发生了什么:

with requests.Session() as session:
    response = session.post(url, data={
        'username': 'some-login',
        'password': 'some-password',
    })
    response = session.get(url)
    print(response.content.decode('utf-8'))
    print(session.cookies)

当 url 设置为我的本地主机上的真实应用程序或 Django 应用程序时,我得到 cookie csrftokensessionid,并且响应显示用户的个人页面。我还在服务器日志中看到了 cookie

当 url 设置为 Docker/K8s/Minikube 服务时,我在脚本中得到相同的 cookie,但响应再次显示登录页面。此外,服务器日志显示没有 cookie...看起来与 Django cookie 处理有关。

【问题讨论】:

  • 尝试将 TLD 从 .local 更改为 .test.lan。请参阅possible cause
  • @Melvyn 嗨,感谢您的回复!我将 TLD 更改为 .test 但没有区别 :( 我猜您链接的主题仅与 127.0.0.1 / localhost 有关,与此类域无关...
  • 是的,值得一试。我远离 .local,因为它是为 "dynamic devices" (multicast DNS / Zeroconf) 保留的。接下来是时间戳。确保 cookie 时间有意义。然后假设代码相同,您几乎没有选择。
  • @Melvyn 坦克寻求建议!我只是查看了时间戳,是的,它们是正确的......但也许 NginX-Ingress 代理在使用 Django 重新向 pod 发送请求之前会吃掉 cookie,以便重置 cookie? ??????
  • 然后请求将发送它们。身份验证后的第一页应该包含带有 Cookie: 的原始请求标头。在视图或中间件中,您可以登录request.COOKIES 以确认它们尚未到达。

标签: django nginx kubernetes cookies minikube


【解决方案1】:

我检查了Django应用的所有设置,发现SESSION_COOKIE_SECURE选项是问题的原因,如the doc says

如果设置为 True,cookie 将被标记为“安全”,这意味着浏览器可以确保 cookie 仅在 HTTPS 连接下发送。

出于安全原因,应用程序配置为在 prod 模式下运行时使用此设置和其他一些设置,而我的 K8s 配置未配置为在调试模式下运行。

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    • 2020-02-28
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多