【发布时间】: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 ip为my-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 csrftoken 和 sessionid,并且响应显示用户的个人页面。我还在服务器日志中看到了 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