Django Rest Framework - приложение React, хотя при использовании маркера CSRF, HTTP-запросы POST, PUT и DELETE возвращают ошибку 403

Я использую Django rest framework в качестве бэкенда API и React в качестве фронтенда. Я хотел бы защитить свой бэкенд, чтобы только фронтенд мог делать "небезопасные" запросы к нему, такие как post, put, delete и т.д. Мое приложение связано с блокчейном, поэтому я использую кошелек MetaMask пользователя в качестве средства аутентификации. Таким образом, у каждого пользователя нет имени пользователя или пароля, поэтому я не могу использовать JWT. Вместо этого я надеялся передать CSRF-токен фронтенду, чтобы позволить фронтенду делать эти "небезопасные" http-запросы.

Я настроил конечную точку на моем бэкенде, чтобы вернуть CSRF-токен на фронтенд, когда он запрашивается. Этот маркер передается нормально. Однако, когда я включаю этот маркер в заголовки "небезопасного" запроса (т.е. "X-CSRFToken"), мой бэкенд возвращает 403 запрещенную ошибку. В документации Django указано, что ошибка 403 может быть результатом передачи неправильного маркера CSRF или неправильных прав доступа. В ответ я установил разрешения на "AllowAny", как показано в моем файле settings.py ниже. Является ли это проблемой неправильной передачи маркера CSRF или неправильной установки разрешений (или ни того, ни другого)?

Насколько я понимаю, когда вы используете CSRF промежуточное ПО Django, оно возвращает cookie на фронтенд. Я подумал, что потенциальной проблемой может быть то, что обычно, когда cookie передается браузеру, он устанавливает его в хранилище cookie. Мой браузер, однако, не сохраняет куки с маркером CSRF в хранилище куки браузера. Что может помешать моему браузеру сохранить куки?

Компонент "Реакция": Здесь это реакция на выполнение функции "postLink", которая часто является ошибкой "403 запрещено".

Django get CSRF Token endpoint:

from rest_framework.decorators import api_view
from django.views.decorators.csrf import csrf_protect, ensure_csrf_cookie

@api_view(['GET'])
@ensure_csrf_cookie
def csrf(request):
        tkn = get_token(request)
        response = Response({'csrfToken': tkn})
        response.set_cookie("X-CSRFToken", tkn, samesite="lax")
        return response

Конечная точка полезной нагрузки поста Django:

@api_view(['GET','POST'])
@csrf_protect
def LinkView(request):
    if request.method == 'POST':
        serializer = LinkSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

Django settings.py:

Если есть лучший способ ограничить доступ к моему Django API, я буду рад услышать другие способы сделать это.

Вы плохо описываете сценарий ошибки. Иногда вы получаете 403 или всегда получаете 403? если иногда, то когда вы получали 403 и когда не получали 403?

если это просто случайность, возможно, это связано с тем, что вы пытаетесь войти в другую вкладку. поэтому csrf поворачивается. объяснено здесь

Вернуться на верх