Недопустимый заголовок авторизации в 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, если это что-то меняет.
Ответы
Ответ 1
Извините, что ответите на мои собственные минутные вопросы, спросив об этом. Но, оказывается, это был apache2 в конце концов! После сканирования веб-страниц и просмотра нескольких результатов поиска я нашел это в комментарии:
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]
Добавление вышеуказанных строк в мой файл conf помогло решить все мои проблемы! Надеюсь, это поможет пользователям спуститься по дороге!
Ответ 2
Если вы используете Apache и mod_wsgi, я нашел это простое решение на официальном веб-сайте Django REST
Специальная конфигурация Apache mod_wsgi
Обратите внимание, что при развертывании в Apache с использованием mod_wsgi заголовок авторизации по умолчанию не передается в приложение WSGI, так как предполагается, что проверка подлинности будет выполняться Apache, а не на уровне приложения.
Если вы развертываете Apache и используете любую проверку, не связанную с сеансом, вам необходимо явно настроить mod_wsgi для передачи необходимых заголовков в приложение. Это можно сделать, указав директиву WSGIPassAuthorization в соответствующем контексте и установив ее на 'On'.
# this can go in either server config, virtual host, directory or .htaccess
WSGIPassAuthorization On
Ответ 3
Это зависит от того, какой тип развертывания Django/Apache вы сделали. Вы должны сообщить правильному модулю Apache, чтобы разрешить HTTP-заголовок "Аутентификация":
Другими словами: многие модули Apache фильтруют HTTP-заголовок "Аутентификация", поэтому Django его не получит. Вы должны быть уверены, что ваше приложение Django получает его по запросу.
См:
django_rest doc и Apache fcgid doc.
Примечание:
После изменения конфигурации Apache вам необходимо перезапустить демон apache или сообщить, чтобы перезагрузить ваш .cgi файл (i.e: touch my_site_fcgifile.fcgi
).