SSL/https удаляет X-CSRFToken из заголовков

После установки ключей SSL/https X-CSRFToken отбрасывается. Я также настраиваю http2. До Https все работало правильно, но теперь я получаю 403, потому что токен CSRF отсутствует. Не удается найти информацию об этой конкретной проблеме. Спасибо за любую помощь.

support
  server {
    # Enable HTTP/2
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl on;
    server_name site.io www.site.io;

    # Use the Let Encrypt certificates
    ssl_certificate /etc/letsencrypt/live/site.io/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/site.io/privkey.pem;

    # Include the SSL configuration from cipherli.st
    include /etc/nginx/snippets/ssl-params.conf;

    add_header Strict-Transport-Security max-age=500;

    access_log /home/nodejs/site.io/resuma_io_access.log;
    error_log /home/nodejs/site.io/resuma_io_error.log;
    root /home/nodejs/site.io/www/dist/client;

     location ~ ^/(api|user|auth|socket.io-client|sitemap.xml) {
          proxy_set_header   X-Real-IP            $remote_addr;
          proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
          proxy_set_header   X-Forwarded-Proto $scheme;
          proxy_set_header   Host                   $http_host;
          proxy_set_header   X-NginX-Proxy    true;
          proxy_set_header Upgrade $http_upgrade;
          proxy_ssl_session_reuse off;
          proxy_redirect off;
          proxy_set_header Connection 'upgrade';
          proxy_cache_bypass $http_upgrade;
          proxy_http_version 1.1;
          proxy_pass_header  X-CSRFToken;
          add_header X-Frame-Options SAMEORIGIN;
          sendfile  off;
          proxy_pass         http://nodejs_upstream;
        }
   }

Ответ 1

У меня такая же проблема, что и Django, работающая на Nginx SSL/https.

Как уже упоминалось Bryan на проверке Django CSRF с запросом POJ Ajax. Еще один способ передать csrftoken - передать его через параметры:

$.ajax({
data: {
    somedata: 'somedata',
    moredata: 'moredata',
    csrfmiddlewaretoken: mytoken
},

Где csrfmiddlewaretoken обозначает имя переменной, используемое вашим api для хранения csrftoken (csrfmiddlewaretoken в django):

И mytoken - это инициализированная переменная

  • DOM: либо с использованием токена с именем переменной вашего api. В django просто добавьте {% csrf_token%} в свой html файл. Это будет передавать переменную csrfmiddlewaretoken, которая будет доступна в jQuery

    mytoken = jQuery("[name=csrfmiddlewaretoken]").val();

  • COOKIE: либо с помощью функции jQuery, которая получает маркер из файла cookie.

    mytoken = getCookie('csrftoken');

Функция getCookie() упоминается в django doc, чтобы иметь дело с CSRF POST с AJAX.

Конечно, это не разрешает проблему с заголовком SSL, но разрешает запрос POST, PUT и DELETE. Он также требует пройти через каждый вызов $.ajax, чтобы добавить переменную csrfmiddlewaretoken

Ответ 2

Чтение моего последнего сеанса в stackoverflow я нашел реальную причину проблемы. В моем случае это была не проблема заголовка, а одна из файлов cookie! CSRFToken не был в файле cookie!

What Wtower answerd 13/05/2015 on 403 Четко объясняется запрещенная ошибка при создании запроса на отправку ajax в Django framework.

CSRF_COOKIE_HTTPONLY = True в settings.py должно быть удалено из settings.py или установлено значение False!!!

Если для этого параметра установлено значение Истина, клиентский JavaScript не сможет получить доступ к файлу CSRF!