Cabeçalho de autorização faltando no django rest_framework, o apache é responsável?

Consegui estender o TokenAuthentication e tenho um modelo de trabalho ao usar a session de solicitação para armazenar meus tokens. No entanto, quando tento passar a Authorization como um parâmetro de header, como descrito aqui , percebi que minhas respostas voltam sem a variável META HTTP_AUTHORIZATION . Eu também notei que se eu passar “Authorization2” como um parâmetro de header que é visível no pedido:

 { '_content_type': '', 'accepted_media_type': 'application/json', '_request': <WSGIRequest path:/api/test_auth/, GET:, POST:, 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', ... 

Meu primeiro palpite é que o header de autorização está sendo removido pelo apache e li algumas perguntas de S / O que afirmam que o apache descartará o valor se ele não corresponder à autorização básica e autenticar, mas não tenho ideia de como permite que o header de autorização passe através do Django e do WSGIRequest. Alguém sabe como resolver esse problema?

Eu também uso mod_auth_cas e mod_proxy, se isso mudar alguma coisa ..

Se você está usando Apache e mod_wsgi, então eu encontrei a solução mais fácil para isso no site oficial do framework Rango do Django.

Configuração específica de apache mod_wsgi

Observe que, se estiver implementando no Apache usando mod_wsgi, o header de autorização não será transmitido para um aplicativo WSGI por padrão, pois é assumido que a autenticação será feita pelo Apache, em vez de no nível do aplicativo.

Se você estiver implantando no Apache e usando qualquer autenticação não baseada em session, será necessário configurar explicitamente o mod_wsgi para passar os headers necessários para o aplicativo. Isso pode ser feito especificando a diretiva WSGIPassAuthorization no contexto apropriado e definindo-a como ‘On’.

 # this can go in either server config, virtual host, directory or .htaccess WSGIPassAuthorization On 

Desculpe por responder minha pergunta minutos depois de perguntar. Mas afinal de contas era apache2 afinal de contas! Depois de rastrear as webs e examinar alguns resultados de pesquisa, encontrei isso em um comentário:

 RewriteEngine on RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule .* - [e=HTTP_AUTHORIZATION:%1] 

Adicionar as linhas acima ao meu arquivo conf pareceu resolver todos os meus problemas! Espero que isso ajude os usuários na estrada!

Depende de qual tipo de implementação do Django / Apache você fez. Você precisa informar ao módulo correto do Apache para permitir a passagem do header HTTP “Authentication”:

  • Apache / mod_wsgi:

    WSGIPassAuthorization On

  • Apache / mod_fcgid:

    FcgidPassHeader Authorization

Em outras palavras: muitos módulos do Apache filtram o header HTTP “Authentication”, então o Django não irá recebê-lo. Você precisa ter certeza de que o seu Django App está recebendo o pedido.

Veja: django_rest doc e Apache fcgid doc .

NOTA: Depois de modificar a configuração do Apache, você precisará reiniciar o daemon do apache ou informar para recarregar seu arquivo .cgi (ou seja: touch my_site_fcgifile.fcgi ).