Ошибка "Given token not valid for any token type" в django, когда я отправляю заголовок с Authorization: None

Когда я отправляю запрос на свой бэкэнд, я получаю ошибку:

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

У меня есть это в файле views.py

class ProblemViewSet(viewsets.ModelViewSet):
    queryset = models.Problem.objects.all()
    serializer_class = serializers.ProblemSerializer
    permission_classes = []

    def retrieve(self, request, *args, **kwargs):
        print(request.META)
        instance = self.get_object()
        user = request.user

        if user is not None and not user.is_anonymous:
            interaction, created = models.InteractionUserProblem.objects.get_or_create(user=user, problem=instance)

            if created:
                interaction.is_viewed = True
                interaction.save()

        serializer = self.get_serializer(instance)
        return Response(serializer.data)

и это в файле settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': ["rest_framework_simplejwt.authentication.JWTAuthentication"],
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    "TEST_REQUEST_DEFAULT_FORMAT": "json",
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
}

из фронтенда приходит заголовок с Authorization: Bearer none, если пользователь не аутентифицирован. Я знаю решение добавить authentication_classes = [], но мне нужна аутентификация, чтобы распознать пользователя, если он аутентифицирован. Так как я могу это исправить, может быть, мне нужно добавить какое-то промежуточное ПО?

Я пытался добавить authentication_classes = [], но это не является решением для меня. Мне нужно как-то перехватить Authorization: Bearer none и как-то обработать его.

Не отправляйте заголовок авторизации для не аутентифицированного пользователя.
Если вы должны отправить его, не используйте Authorization: "Bearer none", используйте только Authorization: "none" или что-нибудь еще (я имею в виду не начиная с Bearer), таким образом, бэкэнд проигнорирует этот заголовок и не вызовет ошибку.

Я также рекомендую защитить ваши представления от неавторизованных пользователей, например, так:

from rest_framework.permissions import IsAuthenticated

class ProblemViewSet(viewsets.ModelViewSet):
    permission_classes = [IsAuthenticated]

Проблема может быть решена с помощью пользовательского промежуточного ПО, которое может исправить недействительный jwt-токен в заголовке запроса.

def delete_none_token(get_response):
    def middleware(request):
        if "HTTP_AUTHORIZATION" in list(request.META.keys()):
            try:
                user = JWTAuthentication().authenticate(request)[0]
                request.user = user
            except:
                user = None
                print("wrong token")
            if not request.user.is_authenticated:
                request.META["HTTP_AUTHORIZATION"] = ""
            if request.META["HTTP_AUTHORIZATION"] == "Bearer none" or request.META["HTTP_AUTHORIZATION"] == "Bearer ":
                request.META["HTTP_AUTHORIZATION"] = ""
        response = get_response(request)
        return response
    return middleware
Вернуться на верх