Файл cookie CSRF не установлен — возможно, заблокирован входом kubernetes

#nginx #cookies #django-rest-framework #csrf #nginx-ingress

Вопрос:

Я использую Axios в React и фреймворке Django Rest dj-rest-auth . После перехода с GCP на Azure и удаления неподдерживаемых django-rest-auth , у меня возникли некоторые новые проблемы с CSRF. Первоначально я удалил django-rest-auth и создал свой собственный вид входа из Django.contrib.auth.views . Заметил, что это также привело к ошибке CSRF в разработке. Поэтому я добавил dj-rest-auth , что решило мою проблему локально. Подтолкнул к AKS, но там печенье по-прежнему не появляется. Я подозреваю, что проблема в моем входе, который может быть установлен INGRESSCOOKIE как для моего бэкенда, так и для интерфейса, но без CSRF.

Я знаю, что на эту тему есть миллион заявок, мои настройки Django в порядке, заголовок set-cookie resopnse установлен. Также используйте правильные настройки axios, чтобы убедиться, что если файл cookie есть, он используется для запросов. Проблема на самом деле в том, что файл cookie набора не проходит, так как он создается в Django.

Я использую контроллер Nginx с TLS на статическом IP-адресе, и мой вход определен следующим образом:

 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