Какой смысл иметь конечную точку выхода из системы в 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