Как использовать аутентификацию JWT-токена для API-запросов с помощью rest_framework_simplejwt без необходимости идентификации пользователя?

У меня есть конечная точка API для моего приложения django, где я позволяю любому человеку с маркером доступа JWT (действительным в течение 15 минут) использовать API. Но это не работает, когда я делаю GET-запрос с маркером доступа. Аутентификация отвечает "Token contained no recognizable user identification". Поскольку доступ к API с маркером должен быть разрешен любому, мне не нужно проверять, действителен ли он для какого-то конкретного пользователя.

JWT - это требование в проекте, чтобы иметь аутентификацию пользователей без статических данных для других API.

Каков правильный/стандартный способ избежать этого? Нужен ли мне пользовательский класс или есть какой-либо лучший способ реализовать аутентификацию с помощью токенов для API?

Я понял это.

Добавлены два класса - классы пользовательской аутентификации и разрешений.

Класс неаутентификации. Просто проверяет, предоставлен ли токен, если предоставлен, проверяет, действителен ли токен.

from rest_framework_simplejwt.exceptions import InvalidToken, TokenError
from rest_framework_simplejwt.tokens import AccessToken
from rest_framework.authentication import BaseAuthentication

class AnonAuthentication(BaseAuthentication):
    def authenticate(self, request):
        auth_header = request.META.get('HTTP_AUTHORIZATION')
        if not auth_header:
            return None

        try:
            prefix, token = auth_header.split()
            if prefix.lower() != 'bearer':
                return None
        except ValueError:
            return None

        try:
            validated_token = AccessToken(token)
            return (None, validated_token)
        except TokenError:
            raise InvalidToken('Token is invalid or expired')

    def authenticate_header(self, request):
        return 'Bearer realm="api"'

Пользовательский класс разрешения только проверяет, авторизован токен или нет.

from rest_framework.permissions import BasePermission

class IsAuthenticatedOrToken(BasePermission):
    def has_permission(self, request, view):
        return bool(request.auth)

Пример:

class CustomAPIListView(generics.ListAPIView):
    queryset = CustomModel.objects.all()
    permission_classes = [IsAuthenticatedOrToken] 
    authentication_classes = [AnonAuthentication]
    ...
Вернуться на верх