Как исправить токен черного списка в 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.