Как принимать запросы от указанных c доменов, используя Django Rest Framework? - PullRequest
0 голосов
/ 19 января 2020

Итак, я настроил свой проект с использованием заголовков CORS для приема запросов со всех доменов. Однако я хочу отфильтровать запросы в представлениях, используя предоставленные пользователем данные. Позвольте мне объяснить: каждый пользователь может создавать проекты, и у этих проектов есть поле с именем whitelisted_domain, которое устанавливается пользователем. Когда запрос попадает в один из этих проектов, я хочу убедиться, что запрос поступил из домена из белого списка. Например:

class CreateTask(APIView):
    def post(self, request, project_id, format=None):
        project = Project.objects.get(id=project_id)
        # Here, I want to check if the two domains match or not
        if project.whitelisted_domain == request.META['REMOTE_HOST']:
            # Create task
        else:
            # Raise authentication error

Проблема в том, что когда я проверяю свое представление с помощью таких служб, как Postman или Reqbin, метаэлемент пуст. Есть ли способ безопасного сопоставления домена запроса и домена, заданного пользователем в представлении? Если нет, как я могу защитить конечную точку? Заголовок секретного ключа является опцией, но что делать, если запросы поступают из пользовательского интерфейса, где в принципе невозможно скрыть учетные данные.

1 Ответ

0 голосов
/ 20 января 2020

Вы можете занести в белый список IP-адреса. Затем проверьте IP, если он находится в белом списке или нет.

def get_client_ip(request):
    x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
    if x_forwarded_for:
        ip = x_forwarded_for.split(',')[0]
    else:
        ip = '127.0.0.1' # check if localhost.
    return ip

И в ваших views.py:

if project.whitelisted_domain == get_client_ip(request):
        # Create task
    else:
        # Raise authentication error
...