Django: файл cookie CSRF не установлен (поддомен + https + apache + wsgi) - PullRequest
0 голосов
/ 27 апреля 2019

Исходная ошибка:

[Sat Apr 27 13:52:46.386072 2019] [wsgi:error] [pid 15601:tid 140129939744512] [remote <ip-address-removed>] Forbidden (CSRF cookie not set.): /login/

Приложение, использующее стандартное представление входа в систему Django.

from .forms import UserLoginForm
path('login/', authviews.LoginView.as_view(authentication_form=UserLoginForm))

И форма представления входа в систему:

<form action="" method="post">
        {% csrf_token %}
       <div class="form-group has-feedback">
          {{ form.username}}
        </div>
        <div class="form-group has-feedback">
          {{ form.password}}
        </div>
        <div class="row">
          <div class="col-8">
          </div>
          <!-- /.col -->
          <div class="col-4">
            <button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button>
          </div>
          <!-- /.col -->
        </div>
      </form>

Файл конфигурации виртуального хоста Apache:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName foo.example.edu.tr

        ServerAdmin foo@example.edu.tr
        DocumentRoot /home/<removed>/projects/abcpweb/production/ABCPWeb/webapp

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined


        # WSGI configurations

        Alias /media/ /home/<removed>/projects/abcpweb/production/ABCPWeb/media/
        Alias /static/ /home/<removed>/projects/abcpweb/production/ABCPWeb/webapp/static/

        <Directory /home/<removed>/projects/abcpweb/production/ABCPWeb/webapp/static>
        Require all granted
        </Directory>

        <Directory /home/<removed>/projects/abcpweb/production/ABCPWeb/media>
        Require all granted
        </Directory>

        WSGIDaemonProcess abcpweb python-home=/home/<removed>/projects/abcpweb/production/EnvABCPWebProd python-path=/home/<removed>/projects/abcpweb/product
ion/ABCPWeb:/home/<removed>/projects/abcpweb/production/EnvABCPWebProd/lib/python3.6/site-packages
        WSGIProcessGroup abcpweb

        WSGIScriptAlias / /home/<removed>/projects/abcpweb/production/ABCPWeb/ABCPWeb/wsgi.py process-group=abcpweb
        WSGIPassAuthorization On
        <Directory /home/<removed>/projects/abcpweb/production/ABCPWeb/ABCPWeb>
        <Files wsgi.py>
        Require all granted
        </Files>
        </Directory>

</VirtualHost>
</IfModule>

файл wsgi.py (я не удалил комментарии, чтобы показать, что я пробовал раньше):

import os, sys, django
sys.path.append('/home/<removed>/projects/abcpweb/production/ABCPWeb')
sys.path.append('/home/<removed>/projects/abcpweb/production/EnvABCPWebProd/lib/python3.6/site-packages')
from django.core.wsgi import get_wsgi_application
from django.core.handlers.wsgi import WSGIHandler

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ABCPWeb.settings")
#django.setup(set_prefix=False)

#from django.core.handlers.wsgi import WSGIHandler
#application = WSGIHandler()
application = get_wsgi_application()

Наконец, связанные частиsettings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'api',
    'webapp',
    'django_celery_results',
    'jsonify',
]


MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
#CSRF_COOKIE_SECURE = False
#SESSION_COOKIE_SECURE = False
#SECURE_SSL_REDIRECT = True
CSRF_COOKIE_DOMAIN = '.example.edu.tr'
SESSION_COOKIE_DOMAIN = '.example.edu.tr'
CSRF_TRUSTED_ORIGINS = ['foo.example.edu.tr', '.example.edu.tr']

ROOT_URLCONF = 'ABCPWeb.urls'
WSGI_APPLICATION = 'ABCPWeb.wsgi.application'

Я прочитал все вопросы об ошибке в Stackoverflow и других связанных платформах, но не смог ее решить.Я работаю над этим около 6 часов, но понятия не имею о появлении ошибки.

Эти ссылки содержат возможные решения, которые я пробовал:

  1. DjangoФайл cookie CSRF не установлен из Stackoverflow
  2. Решение для декоратора (Я не пробовал точно, потому что не хочу отключать защиту CSRF для всех представлений)
  3. Решение Заха (я не пробовал, потому что не хочу изменять файлы ядра django)

Проект работает на локальном компьютере без ошибки.Это происходит на этапе развертывания.Поэтому я думаю, что речь идет о конфигурации HTTPS или поддоменов (wsgi, apache).

ОБНОВЛЕНИЕ: Я решил проблему с добавлением строки (совместно используемой ниже) для ограничения встроенного режима для apache2.conf файл:

WSGIRestrictEmbedded On
...