Как исправить токен черного списка в Django rest framework simple JWT? Ошибка: Данный токен не подходит ни для одного типа токенов"

Я использую аутентификацию rest framework simple_jwt. После входа в систему у меня есть токен доступа и токен обновления. Я проверил на сайте JWT Web tokens, чтобы убедиться, что тип правильный, и токен имеет тип "refresh", тот самый, который я должен передать в Bearer Authorization на Postman. Но я сталкиваюсь с этой ошибкой даже после получения свежего токена refresh после входа в систему:

{
    "detail": "Given token not valid for any token type",
    "code": "token_not_valid",
    "messages": [
        {
            "token_class": "AccessToken",
            "token_type": "access",
            "message": "Token has wrong type"
        }
    ]
}

Мой код:

Настройки:

INSTALLED_APPS = [
 ...
    "rest_framework",
    "rest_framework.authtoken",
    "rest_framework_simplejwt.token_blacklist",   
    ...
]

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ),
}

from datetime import timedelta

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=10),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=30),
    "AUTH_HEADER_TYPES": ("Bearer",),
    "ROTATE_REFRESH_TOKENS": True,
    "BLACKLIST_AFTER_ROTATION": True,
    "ALGORITHM": "HS256",
    "SIGNING_KEY": env("SECRET_KEY"),
}


LogoutSerializer:

class LogoutUserSerializer(serializers.Serializer):
    refresh_token = serializers.CharField()

    default_error_message = {"bad_token": ("Token is invalid or has expired")}

    def validate(self, attrs):
        self.token = attrs.get("refresh_token")  # Corrected accessing the attribute
        try:
            # Ensure the token is not empty
            if not self.token:
                raise serializers.ValidationError("Token is required")

            # Check if the token is valid
            token = RefreshToken(self.token)
            # Ensure the token is a refresh token
            if token.token_type != "refresh":
                raise serializers.ValidationError(
                    "Given token not valid for refresh token type"
                )

        except TokenError:
            raise serializers.ValidationError("Token is invalid or has expired")

        return attrs

    def save(self, **kwargs):
        try:
            token = RefreshToken(self.token)
            token.blacklist()
        except TokenError:
            return self.fail("bad_token")

LogoutView:

class LogoutUserView(GenericAPIView):
    serializer_class = LogoutUserSerializer
    permission_classes = [IsAuthenticated]

    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(status=status.HTTP_204_NO_CONTENT)

Урлы:

path("logout/", LogoutUserView.as_view(), name="logout"),

Я не нашел так много подобных вопросов в Интернете. Видел только несколько, но без решений для моего случая.

Спасибо!

Я пробовал переделать все функции views и serializer и не добился успеха. Ожидаю выхода из системы и добавления в черный список этого refresh token.

Вернуться на верх