Запрещено (CSRF cookie не установлен.): /login/ REACT & DJANGO
Я создал фронтенд с react и бэкенд с django, и все прекрасно работает на localhost, но когда я развернул фронтенд на heroku и сделал POST запрос для входа в систему (бэкенд работает на localhost), я получил следующую ошибку:
Запрещено (CSRF cookie не установлен.): /login/
Код переднего плана:
function getCsrf(){
fetch("http://localhost:8000/csrf/", {
credentials: "include",
})
.then((res) => {
let csrfToken = res.headers.get("X-CSRFToken");
setCsrf({csrf: csrfToken});
})
.catch((err) => {
console.log(err);
})
}
const login = (event) => {
event.preventDefault();
setIsLoading(true)
fetch("http://localhost:8000/login/", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-CSRFToken": csrf.csrf,
},
credentials: "include",
body: JSON.stringify({username: username, password: password}),
})
.then(isResponseOk)
.then((data) => {
console.log(data);
setIsAuthenticated(true)
localStorage.setItem("authenticated", true);
setUsername('')
setPassword('')
setIsLoading(false)
// this.setState({isAuthenticated: true, username: "", password: ""});
})
.catch((err) => {
console.log('inside login catch')
console.log(csrf.csrf, 'catch')
console.log(err);
});
}
const isResponseOk = (response) =>{
if (response.status >= 200 && response.status <= 299) {
return response.json();
} else {
console.log(response)
throw Error(response.statusText);
}
}
useEffect(() => {
//getSessions
setIsLoading(true)
fetch("http://localhost:8000/session/", {
credentials: "include",
})
.then((res) => res.json())
.then((data) => {
// console.log(data);
if (data.isAuthenticated) {
setIsAuthenticated(true)
console.log(data)
} else {
// test()
setIsAuthenticated(false)
console.log(data)
getCsrf()
}
setIsLoading(false)
})
.catch((err) => {
console.log(err);
});
}, [])
код бэкенда:
@require_POST
# @csrf_exempt
def login_view(request):
print(request.body)
data = json.loads(request.body)
print(data)
username = data.get('username')
password = data.get('password')
# username = None
# password = None
# newUser = DjangoUser(username="test", password="test")
# newUser.save()
if username is None or password is None:
return JsonResponse({'detail': 'Please provide username and password.'}, status=400)
user = authenticate(username=username, password=password)
if user is None:
return JsonResponse({'detail': 'Invalid credentials.'}, status=400)
login(request, user)
return JsonResponse({'detail': 'Successfully logged in.'})
@ensure_csrf_cookie
def session_view(request):
if not request.user.is_authenticated:
return JsonResponse({'isAuthenticated': False})
return JsonResponse({'isAuthenticated': True})
Вот мой settings.py
Это потому, что в settings.py вы установили CSRF_COOKIE_SECURE = True и также установили CSRF_COOKIE_HTTPONLY = True. Вы можете обратиться к документации CSRF_COOKIE_SECURE и CSRF_COOKIE_HTTPONLY. Надеюсь, этот ответ будет вам полезен.