Какой смысл иметь конечную точку выхода из системы в django-rest-auth?

В этой статье я читал, что аутентификация на основе токенов не имеет состояния, то есть серверы не ведут учет зарегистрированных пользователей.

С другой стороны, в документации по API django-rest-auth упоминается конечная точка выхода из системы. Для чего это?

1 ответ

Во время выхода из системы выданный пользователю токен аутентификации удаляется. Вы можете проверить источник выхода, где он вызывает request.user.auth_token.delete(), Поэтому при следующем входе пользователя в систему будет выпущен новый токен.

Если вы используете опцию JWT с django-rest-auth, поведение выхода из системы фактически не приводит к удалению токенов JWT. Так что, по сути, он ничего не делает. Я все еще новичок в JWT, но, судя по тому, что я узнал, похоже, что в этом даже нет необходимости. Так что просто удалите на клиенте, и все будет в порядке. Тем не менее, было бы неплохо иметь опцию ПРОСТО УНИЧТОЖИТЬ-JWT-ТОКЕН-ПОТОМУ ЧТО-КТО-НУЖДАЕТСЯ-ПОТЕНЦИАЛЬНО-НЕИСПРОСТРАНЕННЫЙ-ОПАСНЫЙ-ВЕЩЕСТВЕННЫЙ-ВИСИТ. Но, к сожалению, я не думаю, что rest_framework_jwt поддерживает это.

rest_framework_simplejwt (https://github.com/davesque/django-rest-framework-simplejwt), похоже, поддерживает этот многообещающий "черный список"! (rest_framework_simplejwt.token_blacklist) И все же, увы rest_auth не поддерживает simplejwt, прямо вверх - ну хорошо. Если кто-то поймет, как это сделать, я буду в игре.

Но вернемся к тому, что происходит с реализацией jwt rest-auth...

Поэтому, когда вы выходите из системы, он пытается удалить токен django, но я не верю, что вы здесь делаете, поскольку у вас должно быть следующее в вашем settings.py, если вы используете класс JSONWebTokenAuthentication:

settings.py (для JWT)

'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # USED BY JWT.
    'rest_framework.authentication.TokenAuthentication', # IGNORED BY JWT
)

Теперь, когда django-rest-auth переходит к выполнению / выходу из системы, давайте посмотрим, что они делают из своего исходного кода на https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/views.py

views.py (из источника rest-auth)

from django.contrib.auth import (
    login as django_login,
    logout as django_logout
)

from .models import TokenModel


#-------snip-------


class LogoutView(APIView):
    """
    Calls Django logout method and delete the Token object
    assigned to the current User object.
    Accepts/Returns nothing.
    """
    permission_classes = (AllowAny,)

    def get(self, request, *args, **kwargs):
        if getattr(settings, 'ACCOUNT_LOGOUT_ON_GET', False):
            response = self.logout(request)
        else:
            response = self.http_method_not_allowed(request, *args, **kwargs)

        return self.finalize_response(request, response, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.logout(request)

    def logout(self, request):
        try:
            request.user.auth_token.delete()
        except (AttributeError, ObjectDoesNotExist):
            pass
        if getattr(settings, 'REST_SESSION_LOGIN', True):
            django_logout(request)

        response = Response({"detail": _("Successfully logged out.")},
                            status=status.HTTP_200_OK)
        if getattr(settings, 'REST_USE_JWT', False):
            from rest_framework_jwt.settings import api_settings as jwt_settings
            if jwt_settings.JWT_AUTH_COOKIE:
                response.delete_cookie(jwt_settings.JWT_AUTH_COOKIE)
return response

models.py (из источника rest-auth)

from django.conf import settings

from rest_framework.authtoken.models import Token as DefaultTokenModel

from .utils import import_callable

# Register your models here.

TokenModel = import_callable(
getattr(settings, 'REST_AUTH_TOKEN_MODEL', DefaultTokenModel))

Поэтому, если вы не установили атрибут REST_AUTH_TOKEN_MODEL в своих настройках на пользовательскую модель токена (см. https://github.com/Tivix/django-rest-auth/blob/master/docs/configuration.rst - что сомнительно, давайте здесь все честно. Кто это делает...), то он просто пытается удалить DefaultTokenModel - модель аутентификации django_token/session, которую мы не используем.

Я действительно надеюсь, что все перейдет на simplejwt, поскольку он гораздо активнее поддерживается.

И я также надеюсь, что это копание мозгового дампа / jwt кому-то поможет.

PS Еще немного о JWT, оптимальном использовании и черном списке. https://dev.to/_arpy/how-to-log-out-when-using-jwt-4ajm

Другие вопросы по тегам