我this文章我读过基于令牌的身份验证是无状态的,这意味着服务器不会保留已登录用户的记录。
另一方面,在django-rest-auth API docs中提到了一个注销终点。它的用途是什么?
答案 0 :(得分:2)
在注销期间,将删除颁发给用户的身份验证令牌。您可以检出logout source在其调用request.user.auth_token.delete()
的地方。因此,下次用户登录时,将发出一个新令牌。
答案 1 :(得分:0)
如果您在django-rest-auth中使用JWT选项,则注销行为实际上似乎并未删除JWT令牌。因此,它似乎基本上什么也没做。现在,我仍然对JWT还是陌生的,但是根据我所学到的知识,这似乎根本不是必需的。因此,只需在客户端上删除就可以了。仍然有一个JUST-DESTROY-JWT令牌的原因,这是一个很好的选择,因为需要哪些潜在地无法预料的危险的工作区挂起选项。但是可悲的是,我不认为rest_framework_jwt支持这一点。
rest_framework_simplejwt(https://github.com/davesque/django-rest-framework-simplejwt)确实支持此“黑名单”,这很有希望! (rest_framework_simplejwt.token_blacklist)但是,可惜rest_auth不支持simplejwt,直截了当-嗯。如果有人弄清楚如何做到这一点,那我就是游戏。
但是回到rest-auth的jwt实现发生了什么...
因此,当您注销时,它确实会尝试删除django令牌,但是我不认为这就是您在这里所做的,因为如果使用JSONWebTokenAuthentication类,则应该在settings.py中包含以下内容:
settings.py(对于JWT)
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # USED BY JWT.
'rest_framework.authentication.TokenAuthentication', # IGNORED BY JWT
)
现在,当django-rest-auth执行/ logout时,让我们从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挖掘可以帮助某人。
P.S。有关JWT,最佳用法和黑名单的更多信息。 https://dev.to/_arpy/how-to-log-out-when-using-jwt-4ajm