Запрещено (CSRF cookie не установлен.): /api/signinUser

Ошибка возникает в этом коде реакции

const headers = new Headers({
    "X-CSRFToken": Cookies.get('csrftoken')
}); 
const response = await fetch("api/signinUser",
      {
        method: "POST",
        headers: headers,
        body: formData
      });     

Попытка получить доступ к этому Django Api

@ensure_csrf_cookie
def signin(request):
    if request.method == 'POST':
        auth = False
        username = request.POST['username']
        password = request.POST['password']
        
        user = authenticate(username=username, password=password)
        print("Authenticating User", user)
        if user is not None:
            auth = True
            login(request, user) # Does this return anything?
        ret = {
            "auth": auth
        }
        print("RET", ret)
        return JsonResponse(ret)

У меня есть django.middleware.csrf.CsrfViewMiddleware в моей переменной MIDDLEWARE

Я запускаю свой сервер Django в экземпляре AWS EC2, доступ к которому я получаю с помощью http://<my public ip>:8000/

headers: {
    'X-Requested-With': 'XMLHttpRequest',
    'csrftoken': Cookies.get('csrftoken'),
},

Поскольку вы используете HTTP (а не https), вам необходимо убедиться, что файлы cookie не являются https only (т.е. "Secure").

"Проще всего" для этого изменить настройки, чтобы обеспечить работу http cookies (https://docs.djangoproject.com/en/4.1/ref/settings/#csrf-cookie-httponly, https://docs.djangoproject.com/en/4.1/ref/settings/#csrf-cookie-secure и https://docs.djangoproject.com/en/4.1/ref/settings/#session-cookie-httponly).

Однако, поскольку вы находитесь на AWS, довольно легко и дешево получить доступ по HTTPS с действующим сертификатом, если у вас есть (суб)доменное имя, которое вы можете использовать.

  • Создайте себе балансировщик нагрузки (в панели EC2). Это предложит вам...
  • .
  • Создайте "Целевую группу". Целевая группа содержит вышеуказанный экземпляр
  • .
  • Настройте его так, чтобы слушатель на "443" перенаправлял трафик на "80" вашего экземпляра (поэтому вашему экземпляру не нужен сертификат). При этом вам будет предложено создать сертификат в AWS.
  • Направьте свой DNS на балансировщик нагрузки.

Пожалуйста, проверьте стоимость, но обычно дорогая часть (сертификат) бесплатна, и вы можете установить группы безопасности, чтобы заблокировать пользователям прямой доступ к вашему EC2.

Вам следует ознакомиться с документацией.

https://docs.djangoproject.com/en/4.1/ref/csrf/

Скрытое поле формы с именем 'csrfmiddlewaretoken' должно присутствовать во всех исходящих POST формах.

Они имеют в виду скрытое поле ввода в вашей форме.

Для всех входящих запросов, не использующих HTTP GET, HEAD, OPTIONS или TRACE, должен присутствовать CSRF cookie, а поле 'csrfmiddlewaretoken' должно быть настоящим и правильным. Если это не так, пользователь получит ошибку 403.

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