Запрос 403 Forbidden POST при попытке выйти из системы с помощью React front end с Axios и Django с rest-framework
Я продолжаю получать ошибку 403 Forbidden при попытке выйти из учетной записи пользователя. Я могу нормально войти в систему, я вижу в куках, что есть sessionID и csrf-токен. Однако каждый раз при попытке выйти из системы я получаю ошибку 403 Forbidden. У меня стоит withCredentials:true, и я включаю токен csrf в заголовок. У меня есть промежуточное ПО в правильном порядке, у меня есть все правильные конфигурации cors-headers и разрешенные хосты.
При просмотре сведений о сети с помощью F12 я вижу, что cookie sessionID не отправляется вместе с токеном csrf. Не уверен, почему? Я в недоумении.
Вот мой код для фронт-энда входа и выхода, а также соответствующий код settings.py и views.py для logout.
Axios:
import axios from "axios";
axios.defaults.xsrfCookieName = 'csrftoken';
axios.defaults.xsrfHeaderName = 'X-CSRFToken';
const client = axios.create({
baseURL: "http://127.0.0.1:8000",
withCredentials: true,
});
export default client;
Вход:
function submitLogin(e) {
e.preventDefault();
client.post("/api/login/", { username, password }, {
withCredentials: true,
})
.then(function(res) {
if (res.data.redirect_url) {
navigate(res.data.redirect_url);
} else {
console.error("No redirect URL provided.");
}
})
Выход:
function logout(e) {
e.preventDefault();
const csrftoken = document.cookie.split('; ').find(row => row.startsWith('csrftoken='))?.split('=')[1];
client.post("api/logout/", {}, {
withCredentials: true,
headers: {
'X-CSRFToken': csrftoken,
}
}).then(res => {
navigate("/login");
}).catch(error => {
console.error('Logout failed:', error);
});
}
Settings.py
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOWED_ORIGINS = [
'http://localhost:5173', # React development server
'http://127.0.0.1:5173', # Alternative localhost address
]
CSRF_TRUSTED_ORIGINS = [
'http://127.0.0.1:5173',
'http://localhost:5173',
]
Views.py:
class LogoutView(APIView):
permission_classes = [IsAuthenticated]
def post(self, request):
if request.user.is_authenticated:
logout(request)
return Response({'message': 'Logged out successfully'})
else:
return Response({'detail': 'User not authenticated'}, status=403)
Пожалуйста, помогите!