Ich habe die Django Rest Framework Guides gelesen und alle Tutorials durchgeführt. Alles schien Sinn zu machen und so zu funktionieren, wie es sollte. Ich habe die Basis- und Sitzungsauthentifizierung wie beschrieben ausgeführt. http://django-rest-framework.org/api-guide
Ich habe jedoch Probleme mit dem Teil der Token-Authentifizierung in der Dokumentation, der etwas fehlt oder nicht so ausführlich ist wie die Tutorials.
http://django-rest-framework.org/api-guide/authentication/#tokenauthentication
Es heißt, ich muss Token für Benutzer erstellen, gibt aber an, wo in models.py?
Meine Frage ist:
Kann jemand den Token-Authentifizierungsteil der Dokumentation für einen ersten Timer etwas besser erklären?
quelle
post_save
?create_auth_token
als Signalhandler eingerichtet, sodass jedes Mal , wenn aUser
gespeichert wird (daherpost_save
),create_auth_token
aufgerufen wird. Signale sind der interne Mechanismus zur Behandlung von Lebenszyklusereignissen von django.@ ian-clelland hat bereits die richtige Antwort gegeben. Es gibt nur ein paar winzige Teile, die in seinem Beitrag nicht erwähnt wurden, daher werde ich die vollständigen Verfahren dokumentieren (ich verwende Django 1.8.5 und DRF 3.2.4):
Führen Sie die folgenden Schritte aus, bevor Sie den Superuser erstellen. Andernfalls wird dem Superuser sein Token nicht erstellt.
Gehen Sie zu settings.py und fügen Sie Folgendes hinzu:
INSTALLED_APPS = ( 'rest_framework', 'rest_framework.authtoken', 'myapp', ) REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ) }
Fügen Sie den folgenden Code in myapp ‚s models.py :
from django.db.models.signals import post_save from django.dispatch import receiver from rest_framework.authtoken.models import Token from django.conf import settings # This code is triggered whenever a new user has been created and saved to the database @receiver(post_save, sender=settings.AUTH_USER_MODEL) def create_auth_token(sender, instance=None, created=False, **kwargs): if created: Token.objects.create(user=instance)
Wenn Sie expliziter sein möchten, erstellen Sie alternativ eine Datei mit dem Namen signal.py unter myapp project. Geben Sie den obigen Code ein und schreiben Sie in __init__.py
import signals
Öffnen Sie ein Konsolenfenster, navigieren Sie zu Ihrem Projektverzeichnis und geben Sie den folgenden Befehl ein:
Schauen Sie in Ihre Datenbank, eine Tabelle mit dem Namen authtoken_token sollte mit den folgenden Feldern erstellt werden: Schlüssel (dies ist der Token-Wert), erstellt (das Datum, zu dem sie erstellt wurde), Benutzer-ID (ein Fremdschlüssel, der auf die ID-Spalte der Tabelle auth_user verweist)
Erstellen Sie einen Superuser mit
python manage.py createsuperuser
. Schauen Sie sich nun die Tabelle authtoken_token in Ihrer Datenbank anselect * from authtoken_token;
. Sie sollten sehen, dass ein neuer Eintrag hinzugefügt wurde.Mit
curl
oder einer viel einfacheren Alternative httpie , um den Zugriff auf Ihre API zu testen, verwende ich httpie:http GET 127.0.0.1:8000/whatever 'Authorization: Token your_token_value'
Das ist es. Von nun an müssen Sie für jeden API-Zugriff den folgenden Wert in den HTTP-Header aufnehmen ( achten Sie auf die Leerzeichen ):
(Optional) DRF bietet auch die Möglichkeit, das Token eines Benutzers zurückzugeben, wenn Sie den Benutzernamen und das Kennwort angeben. Alles was Sie tun müssen, ist Folgendes in urls.py aufzunehmen :
from rest_framework.authtoken import views urlpatterns = [ ... url(r'^api-token-auth/', views.obtain_auth_token), ]
Verwenden von httpie zur Überprüfung:
http POST 127.0.0.1:8000/api-token-auth/ username='admin' password='whatever'
Im Rückgabekörper sollten Sie Folgendes sehen:
{ "token": "blah_blah_blah" }
Das ist es!
quelle
import signals
in__init__.py
Raisesdjango.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet
in Django 1.9.Unter Django 1.8.2 und Rest Framework 3.3.2 reichte es nicht aus, alle oben genannten Punkte zu befolgen, um eine tokenbasierte Authentifizierung zu ermöglichen.
Obwohl die Einstellung REST_FRAMEWORK in der Django-Einstellungsdatei angegeben ist, sind funktionsbasierte Ansichten erforderlich. @APi_view decorator:
from rest_framework.decorators import api_view @api_view(['POST','GET']) def my_view(request): if request.user.is_authenticated(): ...
Andernfalls wird überhaupt keine Tokenauthentifizierung durchgeführt
quelle
Um meine zwei Cent hinzuzufügen, können Sie diese Aufgabe auch folgendermaßen ausführen, wenn Sie einen benutzerdefinierten Benutzermanager haben, der die Benutzererstellung (und -aktivierung) übernimmt.
from rest_framework.authtoken.models import Token # Other imports class UserManager(BaseUserManager): def create_user(self, **kwargs): """ This is your custom method for creating user instances. IMHO, if you're going to do this, you might as well use a signal. """ # user = self.model(**kwargs) ... Token.objects.create(user=user) #You may also choose to handle this upon user activation. #Again, a signal works as well here. def activate_user(**kwargs): # user = ... Token.objects.create(user=user)
Wenn Sie bereits Benutzer erstellt haben, können Sie in die Python-Shell Ihres Terminals wechseln und Tokens für alle Benutzer in Ihrer Datenbank erstellen.
>>> from django.contrib.auth.models import User >>> from rest_framework.authtoken.models import Token >>> for user in User.objects.all(): >>> ... Token.objects.create(user=user)
Hoffentlich hilft das.
quelle
Es gibt eine sauberere Möglichkeit, das Benutzertoken abzurufen.
Führen Sie einfach die shell.py-Shell aus
und dann
from rest_framework.authtoken.models import Token from django.contrib.auth.models import User u = User.objects.get(username='admin') token = Token.objects.create(user=u) print token.key
dann sollte ein Datensatz in der Tabelle DB_Schema.authtoken_token gefunden werden
quelle
Zusätzlich zu den hervorragenden Antworten möchte ich einen besseren Ansatz für die Tokenauthentifizierung erwähnen: JSON Web Token Authentication. Die von http://getblimp.github.io/django-rest-framework-jwt/ angebotene Implementierung ist sehr einfach zu verwenden.
Die Vorteile werden in dieser Antwort näher erläutert .
quelle
Die JSON-Web-Token-Authentifizierung ist eine bessere Alternative als die Token-Authentifizierung. Dieses Projekt hat JWT Auth mit Django ( http://getblimp.github.io/django-rest-framework-jwt/ ) implementiert, aber derzeit ist das Projekt nicht gepflegt.
Alternativen finden Sie unter: https://github.com/davesque/django-rest-framework-simplejwt
quelle