47

Ich habe es geschafft, TokenAuthentication zu erweitern, und ich habe ein funktionierendes Modell, wenn ich die Anforderungssitzung meine Token zu speichern, aber wenn ich Authorization als Header-Parameter as described here übergeben, bemerkte ich, dass meine Antworten ohne die META-Variable HTTP_AUTHORIZATION zurückkommen . Ich habe auch bemerkt, dass, wenn ich „Authorization2“ als Header-Parameter übergeben, dass es in der Anfrage sichtbar ist:Autorisierungskopf fehlt in Django rest_framework, ist Apache schuld?

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

Meine erste Vermutung ist, dass der Autorisierungsheader von Apache entfernt wird, und ich habe ein paar S gelesen/O Fragen, die besagen, dass Apache den Wert wegwerfen wird, wenn es nicht grundlegende Berechtigung und Authentifizierung entspricht, aber ich habe keine Ahnung, wie der Authorization-Header zu Django und der WSGIRequest übergeben werden kann. Weiß jemand, wie man dieses Problem löst?

Ich benutze auch mod_auth_cas und mod_proxy, ob das etwas ändert ..

Antwort

32

Sorry meine eigene Frage Minuten nach dem zu fragen zu beantworten. Aber es stellte sich heraus, dass es schließlich apache2 war! Nach kriecht die Bahnen und auf der Suche durch ein paar Suchergebnisse gefunden ich dies in einem Kommentar:

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

die obigen Zeilen in meine conf Datei hinzufügen schien alle meine Probleme zu lösen! Hoffentlich hilft dies den Benutzern die Straße runter!

+0

Es gibt ein offenes Ticket, um dieses Apache-Verhalten zu dokumentieren: https://github.com/tomchristie/django-rest-framework/issues/488 Wenn jemand etwas Licht auf z. Nginx Verhalten in dieser Hinsicht wäre auch hilfreich. –

+0

@Tom Christie, so machen Sie das mit nginx: proxy_no_cache $ http_pragma $ http_authorization; proxy_cache_bypass $ http_pragma $ http_authorisation; proxy_set_header HTTP_AUTHORIZATION $ http_authorization; –

+0

@SalvatoreIovene Ich sah ein paar Notizen, als ich graben wollte. Vermutlich nur, wenn Nginx als Proxy verwendet wird. (?) –

55

Wenn Sie Apache und mod_wsgi verwenden, dann fand ich die einfache Lösung, um diese im offiziellen Rahmen Website Django REST

Apache mod_wsgi spezifische Konfiguration

Beachten Sie, dass Apache, wenn die Bereitstellung von mit mod_wsgi, der Autorisierungsheader wird nicht standardmäßig an eine WSGI-Anwendung übergeben, da angenommen wird, dass die Authentifizierung von Apache statt auf Anwendungsebene ausgeführt wird.

Wenn Sie für Apache bereitstellen und jede nicht sitzungsbasierte Authentifizierung verwenden, müssen Sie explizit mod_wsgi konfigurieren, um die erforderlichen Header an die Anwendung zu übergeben. Dies kann durch Angeben der WSGIPassAuthorization-Direktive in dem entsprechenden Kontext und Einstellen von 'On' geschehen.

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

Vielen Dank für das Update. Dies gilt auch für Tasties nicht-Session-basierte Authentifizierung. – garromark

+0

Dies ist NICHT immer die Lösung. Wenn Sie Django in Apache mit fcgid bereitstellen (siehe: https://docs.djangoproject.com/en/1.8/howto/deployment/fastcgi/#apache-shared-hosting), müssen Sie mod_fcgid anweisen, den Header "Authentication" zu übergeben (normalerweise in vhost.cof): FcgidPassHeader Authorization – serfer2

+0

Danke - für mich in Ubuntu gearbeitet 14.04 – slogan621

11

Es hängt davon ab, welche Art von Django/Apache-Bereitstellung Sie getan haben. Sie müssen das richtige Modul für Apache sagen, zu ermöglichen "Authentifizierung" HTTP-Header zu übergeben:

  • Apache/mod_wsgi:

    WSGIPassAuthorization On

  • Apache/mod_fcgid:

    FcgidPassHeader Authorization

In anderen Wörter: Viele Apache-Module filtern den HTTP-Header "Authentifizierung", damit Django sie nicht empfängt. Sie müssen sicher sein, dass Ihre Django App diese Anfrage erhält.

Siehe: django_rest doc und Apache fcgid doc.

HINWEIS: Nach der Änderung der Apache-Konfiguration müssen Sie den Apache-Daemon neu starten oder die Neuinstallation Ihrer .cgi-Datei (d. H. touch my_site_fcgifile.fcgi) veranlassen.