Изменение ключа заголовка для TokenAuthorization в rest_framework

По умолчанию TokenAuthentication в rest_framework использует ключ "Authorization" в заголовке и ищет ключевое слово "Token" при аутентификации запросов.

Authorization: Token [value]

Как изменить его, чтобы вместо него использовался ключ "API-AUTH", а ключевое слово отсутствовало?

API-AUTH: [value]

Вы должны создать пользовательский класс разрешения, который расширяется от TokenAuthentication и переопределяет метод .authenticate().

Ниже приведены модифицированные коды TokenAuthentication.authenticate(), принимающего запрос с API-AUTH в качестве имени заголовка auth со значением token без ключевого слова. Вы можете найти оригинальный исходный код в GitHub фреймворка Django rest здесь.

from django.contrib.auth.models import User
from django.utils.translation import gettext_lazy as _

from rest_framework import authentication
from rest_framework import exceptions
from rest_framework import HTTP_HEADER_ENCODING


class CustomTokenAuthentication(authentication.TokenAuthentication):
    def authenticate(self, request):
        auth = request.META.get('HTTP_API_AUTH', b'')
        if isinstance(auth, str):
            # Work around django test client oddness
            auth = auth.encode(HTTP_HEADER_ENCODING)

        auth = auth.split()
        if not auth:
            return None
        elif len(auth) > 1:
            msg = _('Invalid token header. Token string should not contain spaces.')
            raise exceptions.AuthenticationFailed(msg)

        try:
            token = auth[0].decode()
        except UnicodeError:
            msg = _('Invalid token header. Token string should not contain invalid characters.')
            raise exceptions.AuthenticationFailed(msg)

        return self.authenticate_credentials(token)

Тогда вы можете добавить CustomTokenAuthentication в настройки.

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...  # other permission classes
        'path.to.CustomTokenAuthentication',
    ),
    ...  # other settings
}

Примечания

  • Дополнительную информацию о пользовательской аутентификации можно найти здесь.
Вернуться на верх