13

Zaimplementowałem uwierzytelnianie tokenowe zgodnie z django rest framework Docs.Django Rest Framework - Wylogowanie z tokenu uwierzytelniającego

Formularz, który odczytałem, Uwierzytelnienie tokenowe DRF jest bardzo proste - jeden token na użytkownika, token nie wygasa i jest ważny do użytku zawsze (mam rację?).

Rozumiem, że istnieją lepsze praktyki, ale na razie uwierzytelnianie tokenu DRF jest dla mnie w porządku.

moje pytanie jest- co jest najlepsze praktyki dla wylogowania z normalnego uwierzytelniania tokena DRF?

Mam na myśli, że kiedy użytkownik wylogowuje się z numeru, czy powinienem usunąć token po stronie klienta? a następnie na login odzyskać token? czy powinienem usunąć token i wygenerować nowy?

Ktoś z doświadczeniem z tym?

+0

możliwe duplikat [django ramy reszta - uwierzytelnianie zrozumienie i logowania ] (http://stackoverflow.com/questions/30546258/django-rest-framework-understanding-authentication-and-logging-in) –

Odpowiedz

4

cała idea token uwierzytelniania:

Normalnie usług uwierzytelniania, nie ma życia związany z tokena. Po określonym czasie token traci ważność. Tutaj otrzymujemy token dostępu, który ma czas wygaśnięcia wysłany wraz z nim przez serwer. Teraz klient musi wysłać ten token za każdym razem w nagłówku żądania, aby serwer mógł zidentyfikować użytkownika. Albo możemy śledzić, kiedy wygasa, albo możemy po prostu dalej z niego korzystać, dopóki nie otrzymamy błędu INVALID_TOKEN. W takim przypadku będziemy musieli ponownie pobrać token z serwera.

Czas życia token dostępu jest niezależny od sesji logowania użytkownika, który przyznał dostęp do klienta. OAuth2, powiedzmy, nie ma koncepcji logowania lub wylogowania użytkownika ani sesji. Token jest używany do identyfikacji użytkownika, jeśli jest tym, za kogo się podaje.

Token jest unikalny dla użytkownika i klienta. Możesz zapisać go w ciasteczkach, aby włączyć opcję przypominającą o mnie, ale na serwerze nie musisz jej usuwać. Po wygaśnięciu tokena, klient musi wysłać żądanie do serwera, aby uzyskać token ponownie.

Reklamowe ważności w DRF Reklamowe Authetication:

Obecnie uwierzytelniania DRF Reklamowe nie obsługuje tej funkcji. Musiałbyś to zaimplementować samodzielnie lub skorzystać z pakietu stron trzecich, który zapewnia tę funkcjonalność. Powinien sprawdzić, czy wygasa token i zgłosić wyjątek, jeśli token wygasł.

Aby zaimplementować to samodzielnie, możesz utworzyć podklasę z klasy uwierzytelniania tokenu DRF i dodać swoją logikę.
Można nawet użyć pakietu innej firmy django-rest-framework-expiring-tokens.

Niektóre Referencje:
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

dzięki za odpowiedź. Z tego, co czytam, w DRF token nigdy nie wygasa, mam rację? –

+0

Tak, myślę, że obecnie nie ma funkcji wygaśnięcia tokena w uwierzytelnianiu tokenu DRF. Musisz wprowadzić własną logikę do wygaśnięcia tokena. –

+0

Może to pomoże. https://github.com/JamesRitchie/django-rest-framework-expiring-tokens –

1

Brzmi jak SessionAuthentication jest to, czego naprawdę szuka.Możesz rozpocząć (zalogować się) sesję za pomocą BasicAuthentication lub TokenAuthentication. Następnie użyj sessionid jako swojego "tokena" dla pozostałych wywołań interfejsu API. "Token" wygasa po wylogowaniu lub przekroczeniu określonego czasu.

Jeśli napotkasz problem csrftoken przy użyciu uwierzytelniania sesji, bardzo pomocne może być this.

11

Oto prosty pogląd, że używam do logowania się:

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) 

następnie dodać go do listy urls.py:

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

Nice !!! Dziękuję Ci! –

+2

Przepraszam, ale do czego służy 'queryset'? – dangsonbk

Powiązane problemy