В 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

Другие вопросы по тегам