【问题标题】:CSRF cookie not set - possibly blocked by kubernetes ingressCSRF cookie 未设置 - 可能被 kubernetes 入口阻止
【发布时间】: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

【问题讨论】:

    标签: nginx cookies django-rest-framework csrf nginx-ingress


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2012-05-03
      • 2016-11-26
      • 2018-04-10
      • 2022-09-27
      • 2020-01-16
      • 2021-06-22
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      相关资源
      最近更新 更多