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 中使用 Axiosdj-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”

Django:禁止(未设置 CSRF cookie。)

禁止(未设置 CSRF cookie。):/paypal/ |姜戈

直接访问登录表单时未设置会话 cookie,导致 CSRF 令牌无效

未设置 Django CSRF cookie:使用 Ajax 跨站点

Csrf cookie 未使用 ajax 设置。多个浏览器出错