Django rest framework, changer le json du login du TokenAuthentication

4 septembre 2014
Aymeric

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 intéressabt, 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 bein, 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}

Articles récents

Catégories

Tags