如果您将 JWT 选项与 django-rest-auth 一起使用,注销行为实际上并不会删除 JWT 令牌。所以它似乎基本上什么都不做。现在我还是 JWT 的新手,但根据我所学到的 - 似乎这甚至没有必要。所以只需在客户端上删除就可以了。仍然有一个 JUST-DESTROY-THE-JWT-TOKEN-BECAUSE-WHO-NEEDS-POTENTIALLY-UNEXPIRED-DANGEROUS-STUFF-HANGING-AROUND 选项会很好。但遗憾的是,我不认为 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,因为它得到了更积极的支持。
我也希望这个brain-dump/jwt 挖掘对某人有所帮助。
附:关于 JWT、最佳使用和黑名单的更多信息。 https://dev.to/_arpy/how-to-log-out-when-using-jwt-4ajm