#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