CSRF cookie 未设置 - 可能被 kubernetes 入口阻止
Posted
技术标签:
【中文标题】CSRF cookie 未设置 - 可能被 kubernetes 入口阻止【英文标题】:CSRF cookie not set - possibly blocked by kubernetes ingress 【发布时间】:2022-01-07 08:55:08 【问题描述】:我在 React 和 Django Rest Framework 中使用 Axios 和 dj-rest-auth
。从 GCP 迁移到 Azure 并删除未维护的 django-rest-auth
后,我遇到了一些新的 CSRF 问题。
最初我删除了django-rest-auth
,并从Django.contrib.auth.views
创建了我自己的LoginView。注意到这也给了开发中的 CSRF 错误。所以我添加了dj-rest-auth
,它在本地解决了我的问题。推送到 AKS,但那里的 cookie 仍然没有出现。我怀疑我的入口是问题所在,它可以为我的后端和前端设置INGRESSCOOKIE
,但没有 CSRF。
我知道关于这个主题有一百万张票,我的 Django 设置很好,设置了 set-cookie 响应标头。还要使用正确的 axios 设置来确保如果 cookie 存在,它会用于请求。问题实际上在于 set-cookie 没有通过,因为它是在 Django 中创建的。
我在静态 IP 上使用带有 TLS 的 nginx 控制器,并且我的入口定义如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: basic-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.allow-http: "true"
spec:
tls:
- hosts:
- XXXXX
secretName: tls-secret
rules:
- host: XXXXXXXX
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
- path: /api/
pathType: Prefix
backend:
service:
name: backend
port:
number: 8080
【问题讨论】:
【参考方案1】:问题确实出在入口处,与其说是设置问题,不如说是路由问题。上面使用的路由将所有请求的目标重写为/
。我的后端实际上有一个页面,该页面受 CSRF 保护。它去了那个页面而不是登录页面。将入口更改为以下会产生更好的结果。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: basic-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
nginx.ingress.kubernetes.io/rewrite-target: /$1
kubernetes.io/ingress.allow-http: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- XXXXXXXXXX
secretName: tls-secret
rules:
- host: XXXXXX
http:
paths:
- path: /?(.*)
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
- path: /api/?(.*)
pathType: Prefix
backend:
service:
name: backend
port:
number: 8080
【讨论】:
以上是关于CSRF cookie 未设置 - 可能被 kubernetes 入口阻止的主要内容,如果未能解决你的问题,请参考以下文章
Django 1.9 AJAX 表单 CSRF 令牌 403 错误 - “未设置 CSRF cookie”
禁止(未设置 CSRF cookie。):/paypal/ |姜戈
直接访问登录表单时未设置会话 cookie,导致 CSRF 令牌无效