Проверяйте авторизационный HTTP-заголовок каждого входящего запроса, Django
Я должен проверить авторизационный HTTP-заголовок каждого входящего запроса. В случае отсутствия или недействительности заголовка Authorization я должен вернуть ошибку с HTTP кодом 401 Unauthorized. Как сделать простую проверку заголовка авторизации?
мой код:
models.py
class Event(models.Model):
name = models.CharField('the name of the event', max_length=255)
created_at = models.DateTimeField(default=timezone.now, validators=[LessThanNowValidator()])
additional_data = models.CharField(max_length=300, blank=True, default='')
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return f"{self.name}"
class CustomUser(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
api_token = models.CharField(max_length=100, blank=True, null=True, unique=True)
def clean(self):
self.api_token = Token.objects.create(user=self.user)
middleware.py
class MyMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
user_id = request.POST.get('created_by', False)
try:
api_token = CustomUser.objects.get(user=user_id).api_token
except CustomUser.DoesNotExist:
api_token = ''
response = self.get_response(request)
response['Authorization'] = "Bearer " + api_token
return response
Я пытался написать валидацию в auth.py, но когда я пишу request.headers.get("Authorization",'') список пуст.
Пробовал что-то вроде этого:
auth.py
class BearerTokenAuthentication:
def get_bearer_token(self, request): **#DOEST WORK**
auth = get_authorization_header(request).split() **#EMPTY LIST**
auth_header_prefix = api_settings.BEARER_AUTH_HEADER_PREFIX.lower()
if not auth or smart_text(auth[0].lower()) != auth_header_prefix:
return None
if len(auth) == 1:
return False
elif len(auth) > 2:
return False
return True
views.py:
@action(methods=['POST'], detail=False)
def post(self, request):
if BearerTokenAuthentication.get_bearer_token(request): **#DOES NOT WORK**
tutorial_serializer = EventSerializer(data=request.data)
if tutorial_serializer.is_valid():
tutorial_serializer.save()
return Response(tutorial_serializer.data, status=status.HTTP_201_CREATED)
return Response(tutorial_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
else:
return Response(status=status.HTTP_401_UNAUTHORIZED)
Я не думаю, что это лучший способ и считаю его некрасивым. Тем не менее, вот мое решение:
# i did this in views.py
class SomeView(View):
def get(self, request):
for key, value in request.header.items():
# loop through the header...