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 15

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.META

Edit:

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]