Falta el encabezado de la autorizacion en django rest_framework, es culpa de apache?

TokenAuthentication extender TokenAuthentication y tengo un modelo de trabajo cuando uso la sesión de solicitud para almacenar mis tokens, sin embargo, cuando bash pasar Authorization como un parámetro de encabezado como se describe aquí , noté que mis Responses regresan sin la variable META HTTP_AUTHORIZATION . También noté que si paso “Authorization2” como un parámetro de encabezado que es visible en la solicitud:

 { '_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', ... 

Mi primera suposición es que apache ha eliminado el encabezado de autorización, y he leído algunas preguntas de S / O que afirman que apache arrojará el valor si no coincide con la autorización básica y la autenticación, pero no tengo ni idea de cómo permitir que el encabezado Authorization ‘pase’ a Django y a WSGIRequest. ¿Alguien sabe cómo solucionar este problema?

También uso mod_auth_cas y mod_proxy, si eso cambia algo …

Si está utilizando Apache y mod_wsgi, entonces encontré la solución fácil para esto en el sitio web oficial del framework Django REST

Configuración específica de mod_wsgi de Apache

Tenga en cuenta que si se implementa en Apache utilizando mod_wsgi, el encabezado de autorización no se pasa a una aplicación WSGI de forma predeterminada, ya que se supone que la autenticación será manejada por Apache, en lugar de a nivel de aplicación.

Si se está implementando en Apache, y utilizando cualquier autenticación que no esté basada en sesiones, necesitará configurar explícitamente mod_wsgi para pasar los encabezados requeridos a la aplicación. Esto puede hacerse especificando la directiva WSGIPassAuthorization en el contexto apropiado y configurándola en ‘On’.

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

Perdón por responder mi propia pregunta minutos después de preguntarlo. ¡Pero resulta que fue apache2 después de todo! Después de rastrear las redes y mirar algunos resultados de búsqueda, encontré esto en un comentario:

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

¡Agregar las líneas anteriores a mi archivo conf pareció resolver todos mis problemas! ¡Espero que esto ayude a los usuarios en el futuro!

Depende del tipo de despliegue de Django / Apache que haya realizado. Debe indicarle al módulo Apache correcto que permita pasar el encabezado HTTP de “Autenticación”:

  • Apache / mod_wsgi:

    WSGIPassAuthorization On

  • Apache / mod_fcgid:

    FcgidPassHeader Authorization

En otras palabras: muchos módulos Apache filtran el encabezado HTTP “Autenticación”, por lo que Django no lo recibirá. Debes asegurarte de que tu aplicación Django la reciba a petición.

Ver: django_rest doc y Apache fcgid doc .

NOTA: Después de modificar la configuración de Apache, deberá reiniciar apache daemon o decirle que vuelva a cargar su archivo .cgi (es decir: touch my_site_fcgifile.fcgi ).