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', а не 'авторизации'
Не совсем верно, при выполнении поиска в запросе
META
dict заголовки, которые он на самом деле ищет, находятся без предшествующего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]