有"退出"有什么意义? django-rest-auth中的端点?

时间:2016-10-31 22:09:10

标签: django rest authentication django-rest-auth

this文章我读过基于令牌的身份验证是无状态的,这意味着服务器不会保留已登录用户的记录。

另一方面,在django-rest-auth API docs中提到了一个注销终点。它的用途是什么?

2 个答案:

答案 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