Как использовать аутентификацию 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]
...