Куки CSRF не установлены - возможно, заблокированы kubernetes ingress
Я использую Axios в React и Django Rest Framework с dj-rest-auth
. После миграции с GCP на Azure и удаления не поддерживаемых django-rest-auth
у меня появились новые проблемы с CSRF.
Первоначально я удалил django-rest-auth
и создал свой собственный LoginView из Django.contrib.auth.views
. Заметил, что это также давало ошибку CSRF в разработке. Поэтому я добавил dj-rest-auth
, что решило мою проблему локально. Вывел на AKS, но там куки по-прежнему не отображаются. Я подозреваю, что проблема в моем ингрессе, который может установить INGRESSCOOKIE
как для бэкенда, так и для фронтенда, но CSRF нет.
Я знаю, что есть миллион тикетов на эту тему, мои настройки Django в порядке, заголовок set-cookie resopnse установлен. Также использую правильные настройки axios, чтобы убедиться, что если куки есть, то они используются для запросов. Проблема на самом деле в том, что set-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
Проблемы действительно были на входе, но не столько с настройками, сколько с маршрутизацией. Маршрутизация, используемая выше, переписывает цели в /
для всех запросов. На моем бэкенде на самом деле есть страница, которая защищена 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