web-dev-qa-db-fra.com

cadre de repos Django - Déconnexion de l'authentification par jeton

J'ai mis en œuvre l'authentification par jeton conformément au Django rest framework Docs

D'après ce que j'ai lu, l'authentification par jeton de DRF est assez simple: un jeton par utilisateur, le jeton n'expire pas et est toujours valide (j'ai raison?).

Je comprends qu’il existe de meilleures pratiques, mais pour l’instant, l’authentification par jeton DRF me convient parfaitement. 

ma question est- quelle est la meilleure pratique pour logout avec l'authentification de jeton DRF normale?

Je veux dire, lorsque l'utilisateur se déconnecte, dois-je supprimer le jeton côté client? et ensuite sur login récupérer le jeton? dois-je supprimer le jeton et en générer un nouveau?

Quelqu'un avec de l'expérience avec ça?

17
Ofek Agmon

Voici une vue simple que j'utilise pour me déconnecter:

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

class Logout(APIView):
    def get(self, request, format=None):
        # simply delete the token to force a login
        request.user.auth_token.delete()
        return Response(status=status.HTTP_200_OK)

Ajoutez-le ensuite à votre urls.py:

urlpatterns = [
    ...
    url(r'^logout/', Logout.as_view()),
]
22
gorus

TOUT IDEA DE L'AUTHENTIFICATION DU JETON: 

Normalement, dans les services d'authentification, une durée de vie est associée à un jeton. Après un certain temps, le jeton sera expiré. Ici, nous obtenons un jeton d’accès avec un délai d’expiration envoyé par le serveur. À présent, le client doit envoyer ce jeton à chaque fois dans l'en-tête de la demande afin que le serveur puisse identifier l'identité de l'utilisateur. Soit nous pouvons garder une trace de son expiration ou nous pouvons simplement continuer à l’utiliser jusqu’à ce que nous obtenions une erreur INVALID_TOKEN. Dans ce cas, nous aurions à récupérer le jeton du serveur.

La durée de vie de access_token est indépendante de la session de connexion d'un utilisateur qui accorde l'accès à un client. Disons que OAuth2 n'a pas de concept de connexion ou de déconnexion d'utilisateur, ni de session. Le jeton est simplement utilisé pour identifier l'utilisateur s'il est celui qu'il dit être.

Le jeton est unique pour un utilisateur et un client. Vous pouvez enregistrer les cookies dans des cookies pour permettre, par exemple, de vous souvenir de moi, mais vous n'avez pas besoin de les supprimer sur le serveur. À l'expiration du jeton, le client doit envoyer une demande au serveur pour obtenir à nouveau le jeton. 

Expiration de jeton dans l'authentification de jeton DRF:

Actuellement, l'authentification par jeton DRF ne prend pas en charge cette fonctionnalité. Vous devrez l'implémenter vous-même ou utiliser un package tiers fournissant cette fonctionnalité. Il convient de vérifier l'expiration du jeton et de déclencher une exception si le jeton a expiré. 

Pour l'implémenter vous-même, vous pouvez sous-classer la classe d'authentification de jeton DRF et ajouter votre logique.
Vous pouvez même utiliser un paquet tiers Django-rest-framework-expiring-tokens .

Quelques références:
1. Authentification par jeton pour l'API RESTful: le jeton doit-il être changé périodiquement?
2. Comment se déconnecter d'une application où j'ai utilisé OAuth2 pour me connecter avec Google?

7
Rahul Gupta

Cela ressemble à SessionAuthentication est ce que vous cherchez vraiment. Vous pouvez démarrer (vous connecter) une session via BasicAuthentication ou TokenAuthentication. Ensuite, utilisez sessionid comme "jeton" pour le reste des appels api. Le "jeton" expire lorsque vous vous déconnectez ou que vous dépassez certaines durées.

Si vous rencontrez un problème avec csrftoken lors de l'utilisation de l'authentification de session, this pourrait s'avérer très utile.

1
Diansheng