Пользовательский заголовок не добавляется в request.META в Django Rest Framework
Я реализовал пользовательскую аутентификацию, как описано в документации
# custom_permissions.py
from rest_framework import authentication
from rest_framework import exceptions
class KeyAuthentication(authentication.BaseAuthentication):
def authenticate(self, request):
key = request.META.get('Authorization')
print(key)
if not key:
raise exceptions.AuthenticationFailed('Authentication failed.')
try:
key = ApiKey.objects.get(key=key)
except ApiKey.DoesNotExist:
raise exceptions.AuthenticationFailed('Authentication failed.')
return (key, None)
В моих настройках:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'api_server.apps.api_v1.custom_permissions.KeyAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
),
}
Работает как положено во время тестов:
def test_1(self):
client = APIClient()
client.credentials(X_SECRET_KEY='INVALID_KEY')
response = client.get('/v1/resource/')
self.assertEqual(response.status_code, 403)
self.assertEqual(response.data, {'detail': 'Authentication failed.'})
def test_2(self):
client = APIClient()
client.credentials(X_SECRET_KEY='FEJ5UI')
response = client.get('/v1/resource/')
self.assertEqual(response.status_code, 200)
Однако, когда я тестирую с curl
и локально работающий сервер, там нет X_SECRET_KEY
заголовок найден в request.META
, Это печать None
в терминале, пока ожидается получение ключа.
$ curl -X GET localhost:8080/v1/resource/ -H "X_SECRET_KEY=FEJ5UI"
{'detail': 'Authentication failed.'}
Не могли бы вы дать намек, что может быть проблема с этим?
1 ответ
Решение
Переменные заголовков прописные и имеют префикс "HTTP_". Это общее для Django, не знаю о других языках / фреймворках.
См., Например, https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/authentication.py.