Изменение ключа заголовка для 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
}
Примечания
- Дополнительную информацию о пользовательской аутентификации можно найти здесь.