Ошибка "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