web-dev-qa-db-fra.com

En-tête d'autorisation manquant dans Django rest_framework, Apache est-il à blâmer?

J'ai réussi à étendre TokenAuthentication et j'ai un modèle de travail lorsque j'utilise la session de demande pour stocker mes jetons, cependant quand j'essaye de passer Authorization comme paramètre d'en-tête comme décrit ici , j'ai remarqué que mes réponses reviennent sans la variable META HTTP_AUTHORIZATION. J'ai également remarqué que si je passe "Authorization2" comme paramètre d'en-tête, il est visible dans la demande:

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

Ma première supposition est que l'en-tête d'autorisation est supprimé par Apache, et j'ai lu quelques questions S/O qui indiquent qu'Apache rejettera la valeur si elle ne correspond pas à l'autorisation de base et s'authentifie, mais je ne sais pas comment permettre à l'en-tête d'autorisation de "passer" à Django et WSGIRequest. Quelqu'un sait-il comment résoudre ce problème?

J'utilise également mod_auth_cas et mod_proxy, si cela change quoi que ce soit ..

55
steve-gregory

Désolé de répondre à ma propre question quelques minutes après l'avoir posée. Mais il s'avère que c'était Apache2 après tout! Après avoir exploré les sites Web et parcouru quelques résultats de recherche, j'ai trouvé cela dans un commentaire:

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

L'ajout des lignes ci-dessus à mon fichier conf semble résoudre tous mes problèmes! Espérons que cela aide les utilisateurs sur la route!

35
steve-gregory

Si vous utilisez Apache et mod_wsgi, j'ai trouvé la solution facile à cela dans le site officiel Django REST framework)

configuration spécifique à Apache mod_wsgi

Notez que si vous déployez sur Apache à l'aide de mod_wsgi, l'en-tête d'autorisation n'est pas transmis à une application WSGI par défaut, car il est supposé que l'authentification sera gérée par Apache, plutôt qu'au niveau d'une application.

Si vous déployez sur Apache et utilisez une authentification non basée sur la session, vous devrez configurer explicitement mod_wsgi pour transmettre les en-têtes requis à l'application. Pour ce faire, spécifiez la directive WSGIPassAuthorization dans le contexte approprié et définissez-la sur "On".

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

Cela dépend du type de déploiement Django/Apache que vous avez effectué. Vous devez indiquer au module Apache correct d'autoriser le passage de l'en-tête HTTP "Authentification":

  • Apache/mod_wsgi:

    WSGIPassAuthorization On

  • Apache/mod_fcgid:

    FcgidPassHeader Authorization

En d'autres termes: de nombreux modules Apache filtrent l'en-tête HTTP "Authentification", donc Django ne le recevra pas. Vous devez être sûr que votre Django App le reçoit) en demande.

Voir: Django_rest doc et Apache fcgid doc .

REMARQUE: après avoir modifié la configuration d'Apache, vous devrez redémarrer le démon Apache ou indiquer de recharger votre fichier .cgi (c'est-à-dire: touch my_site_fcgifile.fcgi).

13
serfer2