47

Udało mi się przedłużyć TokenAuthentication i mam działający model podczas używania sesji żądania do przechowywania moich tokenów, jednak gdy próbuję przekazać Authorization jako parametr nagłówka as described here, zauważyłem, że moje odpowiedzi wracają bez zmiennej META HTTP_AUTHORIZATION . Zauważyłem również, że jeśli mijam „Authorization2” jako parametr nagłówka, który jest widoczny na życzenie:Brak nagłówka autoryzacji w django rest_framework, czy apache jest winien?

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

Moje pierwsze przypuszczenie jest, że nagłówek autoryzacja jest usuwany przez apache, i czytałem kilka S/O pytania, które stwierdzają, że apache wyrzuci wartość, jeśli nie pasuje do podstawowej autoryzacji i uwierzytelnienia, ale nie mam pojęcia, jak zezwolić na przechodzenie nagłówka Authorization do Django i WSGIRequest. Czy ktoś wie, jak rozwiązać ten problem?

Używam również mod_auth_cas i mod_proxy, jeśli zmienia nic ..

Odpowiedz

32

Niestety odpowiedzieć na własne pytanie minut po prosząc go. Ale okazało się, że to przecież apache2! Po indeksowania wstęg i pominie kilka wyników wyszukiwania Znalazłem to w komentarzu:

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

Dodając powyższe linie do mojego pliku conf wydawało się rozwiązać wszystkie moje problemy! Mam nadzieję, że pomoże to użytkownikom w drodze!

+0

Jest otwarty bilet do udokumentowania tej apache zachowanie: https://github.com/tomchristie/django-rest-framework/issues/488 Jeśli ktoś może rzucić nieco światła na np. Zachowanie Nginx w tym zakresie również byłoby pomocne. –

+0

@ Tom Christie, tak to robisz z nginx: proxy_no_cache $ http_pragma $ http_authorization; proxy_cache_bypass $ http_pragma $ http_autoryzacja; proxy_set_header HTTP_AUTHORIZATION $ http_authorization; –

+0

@SalvatoreIovene Widziałem wokół niego kilka uwag, kiedy kopałem. Prawdopodobnie ma to zastosowanie tylko w przypadku używania Nginx jako proxy. (?) –

55

Jeśli używasz Apache i mod_wsgi, potem znalazłem proste rozwiązanie tego na oficjalnej stronie ramowej Django REST

Apache mod_wsgi określona konfiguracja

Zauważ, że jeśli wdrożenie do Apache przy użyciu mod_wsgi, nagłówek autoryzacji nie jest domyślnie przekazywany do aplikacji WSGI, ponieważ zakłada się, że uwierzytelnianie będzie obsługiwane przez Apache, a nie na poziomie aplikacji.

Jeśli wdrażasz serwer Apache i używasz uwierzytelniania nie opartego na sesjach, musisz jawnie skonfigurować mod_wsgi, aby przekazać wymagane nagłówki do aplikacji. Można tego dokonać, określając dyrektywę WSGIPassAuthorization w odpowiednim kontekście i ustawiając ją na "Włącz".

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

Dziękujemy za aktualizację. Dotyczy to także uwierzytelniania Tastypie opartego na sesjach. – garromark

+0

To NIE jest zawsze rozwiązanie. Jeśli wdrożyłeś Django w Apache z fcgid (zobacz: https://docs.djangoproject.com/en/1.8/howto/deployment/fastcgi/#apache-shared-hosting), musisz powiedzieć mod_fcgid, aby przekazał nagłówek "Uwierzytelnienie" przez dodawanie (zwykle w vhost.cof): autoryzacja FcgidPassHeader – serfer2

+0

Dzięki - pracowałeś dla mnie w Ubuntu 14.04 – slogan621

11

To zależy od tego, jaki rodzaj Django/Apache rozmieszczenia ty. Trzeba powiedzieć poprawny moduł Apache pozwalają przejść "Autoryzacja" nagłówek HTTP:

  • Apache/mod_wsgi:

    WSGIPassAuthorization On

  • Apache/mod_fcgid:

    FcgidPassHeader Authorization

W innym słowa: wiele modułów Apache filtruje nagłówek HTTP "Autentykacja", więc Django go nie otrzyma. Musisz być pewien, że Twoja aplikacja Django otrzymuje je na żądanie.

Zobacz: django_rest doc i Apache fcgid doc.

UWAGA: Po zmodyfikowaniu konfiguracji Apache należy zrestartować demona apache lub nakazać ponowne załadowanie pliku .cgi (tj. touch my_site_fcgifile.fcgi).

Powiązane problemy