Как выйти из rest_framework с аутентификацией JWT? - PullRequest
0 голосов
/ 26 апреля 2020

Как выйти из системы rest_framework?
Это мой пользовательский сериализатор. Я пользуюсь отдыхом и очень, очень новичком ie. Регистрация и вход в систему работают, но понятия не имею, как ускорить выход из системы.

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)

я получаю сообщение об ошибке: у объекта 'bytes' нет атрибута 'delete'
Когда я использую Код Djoser:

permission_classes = settings.PERMISSIONS.token_destroy

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

при получении этой ошибки: тип объекта 'Token' не имеет атрибута 'objects'

1 Ответ

0 голосов
/ 26 апреля 2020

Я предполагаю, что вы используете 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).

например.

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

В случае аутентификации JWT, поскольку она не имеет состояния и каждый токен JWT действует некоторое время, это означает, что даже если вы удалите токен из БД, пользователь все равно сможет использовать ваши конечные точки на короткое время времени, пока он не истек. Поэтому, в зависимости от того, насколько глубоко вы хотите go, вы можете, например. реализовать ключ кеша "tokens_unable_to_login" и проверить, содержит ли запрос токен JWT, который не должен входить в систему. Или вы даете ему истечь - вы можете поиграть со временем истечения срока действия токена и посмотреть, что идеально подходит для вашего варианта использования. Это зависит от ваших бизнес-требований.

Дайте мне знать, как это go для вас.

...