Django rest framework, changer le json du login du TokenAuthentication
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}