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 поворачивается. объяснено здесь