13

Ho implementato l'autenticazione token in base allo django rest framework Docs.django rest framework - logout autenticazione token

Form quello che ho letto, l'autenticazione token di DRF è piuttosto semplice: un token per utente, il token non scade ed è valido per l'uso sempre (ho ragione?).

Capisco che ci sono buone pratiche là fuori, ma per ora l'autenticazione del token DRF va bene per me.

la mia domanda è- qual è la migliore pratica per il logout con il normale token di autenticazione DRF?

Voglio dire, quando l'utente esegue il logout, devo eliminare il token dal lato client? e quindi su login ottenere di nuovo il token? dovrei eliminare il token e generarne uno nuovo?

Chiunque abbia esperienza con questo?

+0

possibile duplicato del [Django quadro riposo - autenticazione comprensione e la registrazione in ] (http://stackoverflow.com/questions/30546258/django-rest-framework-understanding-authentication-and-logging-in) –

risposta

4

intera idea di token di autenticazione:

Normalmente in servizi di autenticazione, v'è tutta la vita associata con un token. Dopo un tempo specifico, il token sarà scaduto. Qui, otteniamo un token di accesso che ha una scadenza inviata insieme al server. Ora il client deve inviare questo token ogni volta nell'intestazione della richiesta in modo che il server possa identificare chi è l'utente. O possiamo tenere traccia di quando scade o possiamo continuare a usarlo fino a quando otteniamo un errore INVALID_TOKEN. In tal caso dovremmo nuovamente ottenere il token dal server.

La durata di vita di access_token è indipendente dalla sessione di accesso di un utente che concede l'accesso a un client. OAuth2, diciamo, non ha alcun concetto di accesso o disconnessione utente o sessione. Il token è appena usato per identificare l'utente se è chi dice di essere.

Il token è univoco per un utente e un client. Puoi salvarlo sui cookie per abilitare qualcosa come ricordami ma sul server non hai bisogno di cancellarlo. Ogni volta che il token scade, il client deve inviare una richiesta al server per ottenere nuovamente il token.

Token di scadenza in DRF token d'autenticazione:

Attualmente, l'autenticazione DRF Token non supporta questa funzionalità. Dovresti implementarlo tu stesso o utilizzare un pacchetto di terze parti che fornisce questa funzionalità. Dovrebbe controllare la scadenza del token e generare un'eccezione se il token è scaduto.

Per implementarlo da soli, è possibile creare sottoclassi dalla classe di autenticazione token DRF e aggiungere la logica.
È anche possibile utilizzare un pacchetto di terze parti django-rest-framework-expiring-tokens.

Alcune referenze:
1. Token Authentication for RESTful API: should the token be periodically changed?
2. How to Logout of an Application Where I Used OAuth2 To Login With Google?

+0

grazie per la risposta. Da quello che ho letto, in DRF il token non scade mai, ho ragione? –

+0

Sì, penso che non ci sia alcuna funzionalità di scadenza del token attualmente nell'autenticazione token DRF. È necessario implementare la propria logica per la scadenza del token. –

+0

Forse questo potrebbe aiutare. https://github.com/JamesRitchie/django-rest-framework-expiring-tokens –

1

suona come SessionAuthentication è ciò che cercate.È possibile avviare (accedere) una sessione tramite BasicAuthentication o TokenAuthentication. Quindi utilizzare sessionid come "token" per il resto delle chiamate API. Il "token" scade quando si effettua il logout o si supera un certo tempo.

Se si verifica un problema con csrftoken utilizzando l'autenticazione di sessione, this potrebbe essere molto utile.

11

Ecco una semplice opinione che sto usando per uscire:

from django.contrib.auth.models import User 
from rest_framework import status 
from rest_framework.response import Response 
from rest_framework.views import APIView 

class Logout(APIView): 
    queryset = User.objects.all() 

    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) 

quindi aggiungerlo al vostro urls.py:

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

Bello !!! grazie! –

+2

Scusa, ma per cosa viene usato 'queryset'? – dangsonbk

Problemi correlati