Почему Django не генерирует CSRF или сессионные куки-файлы за прокси-сервером Varnish? - PullRequest
6 голосов
/ 20 мая 2011

Запуск Django 1.2.5 на сервере Linux с Apache2 и по какой-то причине Django не может хранить файлы cookie CSRF или Session.Поэтому, когда я пытаюсь войти в систему администратора Django, при отправке формы авторизации выдается ошибка проверки CSRF.Кто-нибудь сталкивался с этим и нашел решение?

Я могу сделать действительное сообщение, когда я пытаюсь это сделать по URL-адресу моего VPS, предоставленного моим хостом.Пример: vps123.hostdomain.com/admin/ и для этого домена устанавливаются файлы cookie.Однако, когда я захожу на сайт www.sitedomain.com/admin/ и пытаюсь войти в систему, я получаю сообщение об ошибке CSRF 403 о том, что файла cookie нет, а когда я проверяю файлы cookie своих браузеров, они не установлены.

IЯ попытался установить следующее в моем файле настроек:

SESSION_COOKIE_DOMAIN = 'www.sitedomain.com'
CSRF_COOKIE_DOMAIN = 'www.sitedomain.com'

Также попытался:

SESSION_COOKIE_DOMAIN = 'vps123.hostdomain.com'
CSRF_COOKIE_DOMAIN = 'vps123.hostdomain.com'

У меня есть 'django.middleware.csrf.CsrfViewMiddleware', добавленный к моему MIDDLEWARE_CLASSES в settings.pyи в форме есть токен CSRF, который отображается в POST.

У меня включены файлы cookie.Я пробовал это на нескольких браузерах и машинах.

Перед www.sitedomain.com находится лаковый прокси-сервер, который, я думаю, может быть частью проблемы.Любой, кто имеет опыт использования прокси-серверов и Django, может пролить свет на это.

Моя конфигурация apache2:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName www.sitedomain.com
    ServerAlias www.sitedomain.com
    <Location "/">
        Options FollowSymLinks
        SetHandler python-program
        PythonInterpreter nzsite
        PythonHandler django.core.handlers.modpython
        PythonDebug On
        PythonPath "['/var/www/django_projects', '/var/www', '/usr/lib/python2.6/dist-packages'] + sys.path"
        SetEnv DJANGO_SETTINGS_MODULE project_one.settings
    </Location>
    <location "/phpmyadmin">
        SetHandler None
    </location>
</VirtualHost>

<VirtualHost *:80>
    ServerName othersite.sitedomain.com
    ServerAlias othersite.sitedomain.com
    <Location "/">
        Options FollowSymLinks
        SetHandler python-program
        PythonInterpreter ausite
        PythonHandler django.core.handlers.modpython
        PythonDebug On
        PythonPath "['/var/www/django_projects', '/var/www', '/usr/lib/python2.6/dist-packages'] + sys.path"
        SetEnv DJANGO_SETTINGS_MODULE project_two.settings
    </Location>
    <location "/phpmyadmin">
        SetHandler None
    </location>
</VirtualHost>

Ответы [ 3 ]

3 голосов
/ 24 мая 2011

Проблема заключалась в том, что перед моим сайтом у меня есть прокси-сервер Varnish. Лак принимал запросы и снимал с них печенье. Чтобы это исправить, мне нужно было, чтобы компания, управляющая сервером Varnish, добавила «/ admin» в список исключений, чтобы куки могли передаваться. Извините, я не могу пролить больше света на процесс лака.

2 голосов
/ 20 мая 2011

Включаете ли вы {{csrf_token}} в шаблон формы?

<form autocomplete="off" method="post" action="{% url auth_login %}">{% csrf_token %}
    {{form|as_p}}
    <input type='submit' />
</form>

И включая промежуточное ПО?

    'django.middleware.csrf.CsrfViewMiddleware',

Судя по вашим изменениям, это может быть связано с конфигурацией VirtualHost в Apache (если ваш провайдер использует apache). Вот отредактированная версия одной из моих конфигураций apache.

<VirtualHost *:80>
ServerName www.domain.com

WSGIProcessGroup my-django-site
WSGIScriptAlias / /path-to-my-django-site/wsgi/production.wsgi
Alias /media /path-to-my-django-site/media
</VirtualHost> 

Это может быть в том случае, если имя сервера в apache должно соответствовать доменному имени, на которое вы попали в поле, наряду с настройками * _COOKIE_DOMAIN в вашей конфигурации Django. Я не уверен, если вы сможете изменить это, хотя. Возможно, стоит поговорить с вашим провайдером, если другие ответы не приведут к победе.

0 голосов
/ 20 мая 2011

Обновляете ли вы данные шаблона с помощью информации csrf?

from django.core.context_processors import csrf

def index(request)
    data = {"listitems": items}
    data.updates(csrf(request))

    return render_to_response('template.html', data)
...