Подтвердить что ты не робот

Недопустимый заголовок авторизации в 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, если это что-то меняет.

4b9b3361

Ответ 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/mod_wsgi:

    WSGIPassAuthorization On

  • Apache/mod_fcgid:

    FcgidPassHeader Authorization

Другими словами: многие модули Apache фильтруют HTTP-заголовок "Аутентификация", поэтому Django его не получит. Вы должны быть уверены, что ваше приложение Django получает его по запросу.

См: django_rest doc и Apache fcgid doc.

Примечание: После изменения конфигурации Apache вам необходимо перезапустить демон apache или сообщить, чтобы перезагрузить ваш .cgi файл (i.e: touch my_site_fcgifile.fcgi).