2016-02-24 9 views
9

Ich befolge die DRF-Dokumente, um TokenAuthentication einzurichten, und kann nicht mit der durchsuchbaren API arbeiten. Ich glaube, ich habe die richtigen Zeilen in settings.py hinzugefügt:Django-REST-Framework: Verwenden von TokenAuthentication mit durchsuchbarer API

REST_FRAMEWORK = { 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication', 
    ), 

INSTALLED_APPS = (
    ... 
'rest_framework', 
'rest_framework.authtoken', 
    ... 

sowie generierten Token für bestehende Benutzer mit dem Code-Schnipsel aus der Dokumentation. Ich kann Token für jeden Benutzer sehen, wenn ich die authtoken_token Tabelle abfrage, also weiß ich, dass sie existieren.

Jedesmal, wenn ich an die durchsuchbaren API einzuloggen, erhalte ich die folgende Inhalt zurückgegeben:

HTTP 401 Unauthorized 
Allow: GET, HEAD, OPTIONS 
Content-Type: application/json 
Vary: Accept 
WWW-Authenticate: Token 

{ 
"detail": "Authentication credentials were not provided." 
} 

So scheint es, die Token-Authentifizierung zu versuchen, aber diese Nachricht ist ein wenig seltsam. Wenn ich ein falsches Passwort eintrage, erhalte ich die Meldung "Ein korrektes Passwort eingeben" auf dem Anmeldeformular. Wenn ich das korrekte Passwort eintrage, scheint es, mich anzumelden, aber bringt mich zum API-Wurzel mit der oben genannten Nachricht und zeigt "Log In" im oberen Menü an, anstatt den Benutzernamen.

Könnte das irgendwie mit meinem benutzerdefinierten Benutzermodell zusammenhängen? Oder könnte es daran liegen, dass ich gerade mit dem Dev-Server entwickle, der https nicht unterstützt - die DRF-Dokumente nennen HTTPS mit TokenAuthentication, obwohl ich nicht sicher war, ob dies eine Best Practice war oder tatsächlich erforderlich war .

Antwort

11

Sie können die durchsuchbare API nicht mit TokenAuthentication verwenden. Sie haben SessionAuthtication, um Ihre Einstellungen hinzuzufügen (http://www.django-rest-framework.org/api-guide/authentication/#sessionauthentication):

REST_FRAMEWORK = { 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication', 
    'rest_framework.authentication.SessionAuthentication', 
), 
+0

Ich denke, dass die Antworten, dass- es Ihnen danken! – dkhaupt

+0

Wenn ich diese Berechtigung hinzufüge, heißt das nicht, dass jemand, der eine Anfrage an meinen Server stellt, nur mit Benutzername und Passwort (wie ohne Tokenauth) darauf zugreifen kann, oder? Es funktioniert nur für Websites, die ich denke, aber ich wollte sicher sein. –

+0

Sogar "rest_framework.authentication.BasicAuthentication" würde den Zweck erfüllen. Ich bevorzuge es, weil SessionAuthentication idealerweise nur verwendet werden sollte, wenn Ihr Server und Ihr Client beide im selben Kontext wie Django-Templates laufen. @KutayDemireren - Ja, jeder mit Benutzername/Passwort und entsprechender Berechtigung hat Zugriff auf die APIs. Aber es ist Ihnen überlassen, API-Endpunkt zu veröffentlichen oder nicht. –

Verwandte Themen