2014-01-23 12 views
50

Ich möchte eine Login-API erstellen (oder verwenden Sie eine vorhandene, wenn es bereits vorgebündelt ist) mit Django Rest Framework. Ich bin jedoch völlig ratlos. Jedes Mal, wenn ich einen Post-Anforderung an den django Rest Rahmen senden "login" url, sendet sie zurück, nur die durchsuchbaren api Vorlagenseite ...Wie erstelle ich eine Login-API mit Django Rest Framework?

meine Konfiguration

urls.py

url(r'^api/v1/', include('rest_framework.urls', namespace='rest_framework')) 

settings.py

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.BasicAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
    ) 
} 

, was ich will

Anfrage:

POST /api/v1/login username='name' pass='pass' 

Antwort:

200 OK "{username: 'name', 'userId': '54321'}" set-cookie: sessionid="blahblah" 
+0

ich ausrollen gerade bin der Planung auf die api mit https und basic auth. Aber hat der Browser eine sichere Möglichkeit, die Authentifizierungsdaten zu speichern? Ich möchte nicht, dass sich die Benutzer ständig neu anmelden müssen, wenn sie die Website durchsuchen und dann zu meiner Website zurückkehren. Ich möchte die Sitzungsauthentifizierung aufgrund von csrf-Tokens abschaffen ... Sie sind brutal in einer API zu verwalten. Ich möchte meinen Kuchen haben und es essen, um ... – JayPrime2012

+0

Angenommen, der Browser bietet einen permanenten Speicher nach Domänen sortiert, auf den nur die Besitzerdomäne zugreifen kann, ich denke, ich könnte nur Sitzungs-ID im persistenten Speicher und nicht im Cookie speichern verhindern CSRF-Schwachstellen in meiner API-basierten Website. – JayPrime2012

+6

Haben Sie herausgefunden, wie es geht? – jul

Antwort

35

Werfen Sie einen Blick auf die api Ansicht von django-rest-framework-jwt. Es handelt sich um eine Implementierung zum Erstellen von Authentifizierungs-Tokens anstelle von Cookie-Sitzungen. Die Implementierung wird jedoch ähnlich sein. Siehe views.py und serializers.py. Sie können wahrscheinlich serializers.py unverändert verwenden und Ihre Ansichten anpassen, um die richtigen Parameter zurückzugeben und möglicherweise den Sitzungscookie zu setzen (Sie können nicht mehr darauf zugreifen, wenn dies bei der Authentifizierung bereits erfolgt ist).

14

Wenn Sie so etwas wollen, mache ich dasselbe, aber ich benutze Token-Authentifizierung.

Schauen Sie sich ihre Token Seite here

Das kann nicht sein, was Sie wollen, aber die Art, wie ich es tun ist (da ich es als Rest api Endpunkte für mobile Clients bin mit)

ich kann tun, um meine url localhost:8000/api/users/ -H Authorization : Token Ein Browser dann die reguläre Anmeldeseite verwenden könnte, die Sie an der vorgesehenen Ruhe Rahmen uRL erstellen

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')

und zu erhalten, kens für 'Login-less' Navigation

url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token')

Dann, wenn Sie Anrufe tätigen und so Sie die Berechtigungs Token passieren kann. Natürlich ist es genau das, was ich tue und es ist wahrscheinlich nicht der effizienteste Weg, aber mein Ziel war es, eine Möglichkeit zu schaffen, mit der ich Benutzern Session-Authentifizierung für Browser und mobilen Zugriff über Tokens ermöglichen kann.

Dann stellen Sie in Ihrem views.py sicher, dass Sie die Authentifizierungsanforderungen für diese Ansicht hinzufügen. Fast die gleichen wie Sitzungsauthentifizierung Abschnitt

permission_classes = (permissions.IsAdminUser,)

aber auch

authentication_classes = (authentication.TokenAuthentication,)

Ich hoffe, das hilft, aber wenn nicht, viel Glück auf Ihrer Suche.

+0

Ich benutze Django Rest Framework Token Auth, und ich bekomme das Token nach der Bereitstellung des Benutzernamens/Passwort, aber ich möchte auch die user_id (die pk des benutzers) zusammen mit dem token erhalten, damit ich in einer localStorage speichern und mit dieser ID arbeiten kann, wenn sie in der mobilen app benötigt wird. Was ist der richtige Weg, um den Primärschlüssel des Benutzers zu erhalten, wenn ein Token angefordert wird? – Nerses

+0

Überprüfen Sie den obigen Kommentar mit der serializers.py. Sie können möglicherweise ein PK-Rückgabefeld hinzufügen. Wenn Sie danach suchen. – user1171911

9

Natürlich Token ist eine gute Möglichkeit zur Authentifizierung, aber Frager fragt nach Sitzungsauthentifizierung.

Anfrage:

POST /api/v1/login username='username' password='password' 
  • Put csrftoken Wert bei X-CSRFToken in Kopf
  • Auch wenn jemand email als Benutzernamen verwenden, eingereicht username Name Parameter für E-Mail-Eingabe erforderlich (zB username='[email protected]')

Antwort:

302 FOUND sessionid="blahblah" 
  • Wenn Sie nicht next Wert angegeben, wird es automatisch in /accounts/profile/ umleiten, die
0

Hinzufügen unsere Ansichten 404 Fehler ergeben können:

from rest_framework_jwt.views import refresh_jwt_token 

urlpatterns = [ 
    ... 
    url(r'^rest-auth/', include('rest_auth.urls')), 
    url(r'^rest-auth/registration/', include('rest_auth.registration.urls')), 
    ... 
    url(r'^refresh-token/', refresh_jwt_token), 
] 
Verwandte Themen