Le login avec Django Rest Framework et le TokenAuthentication
Le TokenAuthentication à un fonctionnement extrêmement simple, à la connexion l’API retourne un token qu’il faut ensuite passer dans le Header de chaque requête nécessitant d’être connecté.
Le truc vraiment cool, c’est que TokenAuthentication propose directement une view qui s’occupe de connecter un utilisateur.
Il suffit d’ajouter les lignes suivantes dans urls.py
urlpatterns += patterns('', url(r'^api-token-auth/', 'rest_framework.authtoken.views.obtain_auth_token') )
En appelant avec curl l’api, on récupère le token :
$ curl -X POST http://127.0.0.1:8000/api-token-auth/ -d 'username=mon@mail.com&password=1234' {"token": "e4dcf12d52f04f654e85e7f409ae524f58b9a7g7"}
Récupérer plus d’info !
Récupérer le token c’est cool, mais ce qui pourrait être pratique c’est de récupérer plus d’infos (comme l’id de l’utilisateur par exemple). Pour cela, en suivant les dires de la documentation, il suffit d’override la view class ObtainAuthToken.
Allons y, Créons notre view pour l’authentification !
from requests import Response from rest_framework import status from rest_framework.authtoken.models import Token from rest_framework.authtoken.views import ObtainAuthToken class CompleteObtainAuthToken(ObtainAuthToken): def post(self, request): serializer = self.serializer_class(data=request.DATA) if serializer.is_valid(): u = serializer.object['user'] token, created = Token.objects.get_or_create(user=u) return Response({ 'token': token.key, 'user_id': u.id }) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) obtain_auth_token = CompleteObtainAuthToken.as_view()
Et changeons l’url par cette nouvelle vue que nous avons créé
urlpatterns += patterns('', url(r'^api-token-auth/', 'my_project.views.obtain_auth_token') )
Et maintenant notre url d’authentification à l’API retourne bien l’id de l’utilisateur en plus :
$ curl -X POST http://127.0.0.1:8000/api-token-auth/ -d 'username=mon@mail.com&password=1234' {"token": "e4dcf12d52f04f654e85e7f409ae524f58b9a7g7", "user_id": 24}