14

Ich versuche, die TokenAuthentication mit einer meiner Ansichten zu verwenden. Wie in http://django-rest-framework.org/api-guide/authentication.html dokumentiert, füge ich das Token, das ich von der Anmeldung erhalten habe, als HTTP-Header mit dem Namen: 'Autorisierung' in der Anfrage, die ich sende, hinzu.Django TokenAuthentication fehlt die 'Authorization' HTTP-Header

Das Problem ist, dass in meinen Unittests die Authentifizierung fehlschlägt. Blick in die TokenAuthentication Klasse ich sehe, dass der Header überprüft wird ‚HTTP_AUTHORIZATION‘ und nicht ‚Authorization‘

Die Ansicht Ich verwende:

class DeviceCreate(generics.CreateAPIView): 
    model = Device 
    serializer_class = DeviceSerializer 

    authentication_classes = (TokenAuthentication,) 
    permission_classes = (IsAuthenticated,) 

den Header ‚HTTP_AUTHORIZATION‘ scheint Wechsel zu arbeiten , aber etwas fühlt sich falsch an.

Fehle ich etwas?

Antwort

16

Blick in die TokenAuthentication Klasse ich sehe, dass der Header überprüft wird ‚HTTP_AUTHORIZATION‘ und nicht

‚Authorization‘ Das stimmt nicht ganz, wenn Lookups in der Anfrage META dict tun, die Header, die es eigentlich suchen sind mit ohne die vorhergehenden HTTP_, so request.META.get('HTTP_AUTHORIZATION', '')ist tatsächlich nachschlagen die Authorization Header in der Anfrage.

Das Problem ist, dass in meinen Unittests die Authentifizierung fehl den Header ‚HTTP_AUTHORIZATION‘ Wechsel scheint

ich zu arbeiten havn't doppelt geprüft, wie das Test-Client aussieht, aber ich glaube, dass HTTP_AUTHORIZATION Einstellung ist, was Sie tun müssen, um das Äquivalent von tatsächlich Authorization Header zu setzen. Wenn Sie tatsächlich eine http-Anfrage gestellt haben, sollten Sie feststellen, dass das Einstellen der Auth-Header genau so funktioniert, wie Sie es erwarten.

Siehe request.META Dokumentation hier: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.META

bearbeiten:

Django docs auf Nachschlagen Header in request.META:

Mit Ausnahme von CONTENT_LENGTH und CONTENT_TYPE, wie oben angegeben, Alle HTTP-Header in der Anforderung werden in META-Schlüssel konvertiert, indem alle Zeichen in Großbuchstaben konvertiert und ersetzt Alle Bindestriche mit unterstrichen und fügen dem Namen ein HTTP_-Präfix hinzu. So würde beispielsweise ein Header namens X-Bender dem META Schlüssel HTTP_X_BENDER zugeordnet werden.

Django docs Header mit dem Test-Client auf Einstellung:

Allerdings können Sie Schlüsselwörter Argumente verwenden, um einige Standardschriften angeben.Zum Beispiel wird dies ein User-Agent HTTP-Header in jeder Anfrage senden:

c = Client (HTTP_USER_AGENT = 'Mozilla/5.0')

4

Tom's answer ist in Ordnung, aber nicht Komplett.

Ihr Code kann in dev environment (mit runserver) gut funktionieren, aber wenn Sie es in einem WSGI-Server (Apache in meinem Fall) versuchen, kann der Server den Autorisierungskopf löschen!

Sie auf Boone's Blog eine gute Lösung für Apache conf den Authorization-Header in der Anfrage zu halten und machen große Arbeit finden können:

RewriteEngine on 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] 
+0

Link zum Blog ist tot, aber dass die Spitze gerettet meine geistige Gesundheit. wusste nicht, dass Apache/WSGI Header löschte! – twig