В django rest_framework отсутствует заголовок авторизации, виноват apache?
Мне удалось продлить TokenAuthentication
и у меня есть рабочая модель при использовании сеанса запроса для хранения моих токенов, однако, когда я пытаюсь передать Authorization
как параметр заголовка, как описано здесь, я заметил, что мои ответы возвращаются без переменной META HTTP_AUTHORIZATION. Я также заметил, что если я передаю "Authorization2" в качестве параметра заголовка, это видно в запросе:
{
'_content_type': '',
'accepted_media_type': 'application/json',
'_request': <WSGIRequest
path:/api/test_auth/,
GET:<QueryDict: {}>,
POST:<QueryDict: {}>,
COOKIES:{
'MOD_AUTH_CAS_S': 'ba90237b5b6a15017f8ca1d5ef0b95c1',
'csrftoken': 'VswgfoOGHQmbWpCXksGUycj94XlwBwMh',
'sessionid': 'de1f3a8eee48730dd34f6b4d41caa210'
},
META:{
'DOCUMENT_ROOT': '/etc/apache2/htdocs',
'GATEWAY_INTERFACE': 'CGI/1.1',
'HTTPS': '1',
'HTTP_ACCEPT': '*/*',
'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.3',
'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch',
'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8',
'HTTP_AUTHORIZATION2': 'Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4c',
...
Мое первое предположение состоит в том, что apache удаляет заголовок авторизации, и я прочитал несколько вопросов S/O, в которых говорится, что apache выбросит значение, если оно не соответствует базовой авторизации и аутентификации, но я понятия не имею, как это сделать. Позвольте заголовку авторизации проходить через Django и WSGIRequest. кто-нибудь знает, как решить эту проблему?
Я также использую mod_auth_cas и mod_proxy, если это что-то изменит..
3 ответа
Извините, что отвечаю на мой вопрос через несколько минут после того, как задаю его. Но оказывается, что это был apache2 в конце концов! После сканирования веб-страниц и просмотра нескольких результатов поиска я нашел это в комментарии:
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
Добавление вышеуказанных строк в мой conf-файл, похоже, решило все мои проблемы! Надеюсь, это поможет пользователям в будущем!
Если вы используете Apache и mod_wsgi, то я нашел простое решение для этого на официальном веб-сайте Django REST Framework
Apache mod_wsgi конкретная конфигурация
Обратите внимание, что при развертывании в Apache с использованием mod_wsgi заголовок авторизации по умолчанию не передается приложению WSGI, так как предполагается, что аутентификация будет обрабатываться Apache, а не на уровне приложения.
Если вы развертываете в Apache и используете любую аутентификацию, не основанную на сеансах, вам нужно будет явно настроить mod_wsgi для передачи необходимых заголовков в приложение. Это можно сделать, указав директиву WSGIPassAuthorization в соответствующем контексте и установив для нее значение "Вкл.".
# this can go in either server config, virtual host, directory or .htaccess
WSGIPassAuthorization On
Это зависит от того, какой тип развертывания Django/Apache вы сделали. Вы должны указать правильный модуль Apache, чтобы разрешить передавать HTTP-заголовок "Аутентификация":
Apache / mod_wsgi:
WSGIPassAuthorization On
Apache / mod_fcgid:
FcgidPassHeader Authorization
Другими словами: многие модули Apache фильтруют HTTP-заголовок "Аутентификация", поэтому Django не получит его. Вы должны быть уверены, что ваше приложение Django получает его по запросу.
Смотрите: django_rest doc и Apache fcgid doc.
ПРИМЕЧАНИЕ. После изменения конфигурации Apache вам необходимо перезапустить демон apache или указать перезагрузить файл.cgi (то есть: touch my_site_fcgifile.fcgi
).
Проблема заключается в подчеркивании в заголовке HTTP. HTTP_AUTHORIZATION
. Большинство веб-серверов просто игнорируют заголовки с подчеркиванием.
Сервер Django dev также демонстрирует то же самое, без заголовков с подчеркиванием.
Это причина, по которой Authorization2
работает.
Быстрый обходной путь - заменить _
подчеркивания в заголовках с -
тире
Ex. изменениеHTTP_AUTHORIZATION
к HTTP-AUTHORIZATION