如何在 rest_framework 中用 JWT 认证注销?

问题描述 投票:0回答:1

如何在 rest_framework 中注销?这是我的用户序列器。我正在使用 rest,而且是非常非常的新手。注册和登录可以用,但不知道如何实现注销。

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(write_only=True)

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'email')
        write_only_fields = ('username', 'email', 'password',)
        read_only_fields = ('id', )

注册部分

class UserCreateAPIView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = [permissions.AllowAny]

登录代码;我使用JWT认证。

path(r'login/', obtain_jwt_token, name='ObtainJWTToken'),

当我使用这段代码时

@api_view(['POST'])
def logout(request):
    request.auth.delete()
    return Response(status=status.HTTP_204_NO_CONTENT)

我得到错误:'字节'对象没有属性'删除'当我使用Djoser代码时,得到错误:类型对象'Token'没有属性'对象'。

permission_classes = settings.PERMISSIONS.token_destroy

    def post(self, request):
        utils.logout_user(request)
        return Response(status=status.HTTP_204_NO_CONTENT)

得到这个错误:类型对象'Token'没有属性'objects'。

python django-rest-framework logout
1个回答
0
投票

我想你使用的是 TokenAuthentication.

在这种情况下,可以试试这个方法。

class LogoutAPIView(APIView):
    def get(self, request):
        request.user.auth_token.delete()
        return Response(status=status.HTTP_200_OK)

但是,请注意,这将删除令牌,并强制注销。

如果您使用 SessionAuthentication你的身体 get() 的方法。 LogoutAPIView 阶层 logout(request).

例如,在JWT认证的情况下,由于它是无状态的,而且每个JWT令牌都有一段时间的有效期,这意味着即使你从数据库中删除了令牌,用户仍然能够使用你的终端。

def get(self, request):
    logout(request)
    return Response(status=status.HTTP_200_OK)

在JWT认证的情况下,由于它是无状态的,而且每个JWT令牌都有一段时间的有效期,这意味着即使你从DB中删除了令牌,用户仍然可以在短时间内使用你的端点,直到它过期。因此,根据你想深入的程度,你可以例如实现一个 "tokens_unable_to_login "的缓存键,并检查请求是否包含一个不应该登录的JWT令牌。或者你让它过期--你可以玩弄一下token的过期时间,看看什么是你的用例的理想选择。这取决于你的业务需求。

让我知道你是怎么做的。

© www.soinside.com 2019 - 2024. All rights reserved.