Django TokenAuthentication отсутствует заголовок http 'Authorization'
Я пытаюсь использовать Токенаутентификацию с одним из моих взглядов. Как задокументировано в http://django-rest-framework.org/api-guide/authentication.html , я добавляю маркер, полученный от входа в систему, в качестве заголовка HTTP под названием: 'Authorization' в отправленном запросе.
Проблема в том, что в моих unittests аутентификация не проходит. Заглянув в класс TokenAuthentication, я вижу, что проверяемый заголовок - это "HTTP_AUTHORIZATION", а не "Authorization"
Вид, который я использование:
class DeviceCreate(generics.CreateAPIView):
model = Device
serializer_class = DeviceSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
Изменение заголовка на "HTTP_AUTHORIZATION", кажется, работает, но что-то не так.
Я что-нибудь упустил?
2 ответа:
Заглянув в класс TokenAuthentication я вижу, что заголовок проверки - 'HTTP_AUTHORIZATION', а не 'авторизации'
Не совсем верно, при выполнении поиска в запросе
METAdict заголовки, которые он на самом деле ищет, находятся без предшествующегоHTTP_, так чтоrequest.META.get('HTTP_AUTHORIZATION', '')это на самом деле ищет ЗаголовокAuthorizationв запросе.Проблема в том, что в моих unittests аутентификация не проходит Изменение заголовка на "HTTP_AUTHORIZATION", кажется, работает
Я не проверял дважды, как выглядит тестовый клиент, но я считаю, что установка
HTTP_AUTHORIZATION- это то, что вам нужно сделать, чтобы получить эквивалент фактической установки заголовкаAuthorization. Если вы действительно сделали запрос http, вы должны обнаружить, что установка заголовка auth работает именно так, как вы ожидали.Смотрите здесь документацию
request.META: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.METAEdit:
Django docs о поиске заголовков в
request.META:За исключением CONTENT_LENGTH и CONTENT_TYPE, как указано выше, любые заголовки HTTP в запросе преобразуются в мета-ключи с помощью преобразование всех символов в верхний регистр, замена любых дефисов на подчеркивает и добавляет префикс HTTP_ к имени. Так, например, заголовок под названием X-Бендер будет соответствовать мета ключевые HTTP_X_BENDER.
Django docs по настройке заголовков с тестовым клиентом:
Однако, вы можете использовать ключевые слова, аргументы, чтобы указать некоторые заголовки по умолчанию. Например, это будет отправлять заголовок HTTP
User-Agentв каждом запросе:C = клиент (HTTP_USER_AGENT= 'Mozilla/5.0')
Ответ Тома прекрасен, но не полон.
Ваш код может прекрасно работать в среде разработки (с
runserver), но если вы попробуете его на сервере WSGI (Apache в моем случае), сервер может удалить заголовок авторизации !Вы можете найти в блоге Буна хорошее исправление для вашего Apache conf, чтобы сохранить заголовок авторизации в запросе и сделать его отличным:
RewriteEngine on RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]