ioangrozniy
@ioangrozniy

Как правильно сделать запрос на сервер с csurf?

Сломал себе всю голову как сделать финт ушали.
Делаю приложуху на vue.
Для теста надо сделать post ajax запрос на сервер на nodejs с csurf.
Пробовал так:
let token = await fetch("http://site/admin/", {method:'get'}).then(data=>data.json())
let response = await fetch("http://site/admin/", {
        credentials: 'same-origin',
        method: 'post',
        headers: {
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            "X-CSRF-Token": token.csrfToken
        },
        body: .....
    });

Токен получает, но при ПОСТ на сервере вылетает сообщение что "ForbiddenError: invalid csrf token"
Причём подозреваю, что он их воспринимает как запросы с разных клиентов.
Так вот, как можно исправить эту ситуацию?
  • Вопрос задан
  • 571 просмотр
Пригласить эксперта
Ответы на вопрос 1
@bahurtsev
У вас вот тут интересная строка:
let token = await fetch("http://site/admin/", {method:'get'}).then(data=>data.json())

Одновременно и await и .then();

Вот как я сделал:

Клиент:
function get_csurf_token(){

	return new Promise(async (resolve, reject) => {
		let response = await fetch('/get_csurf_token', {
			method:'get',
			headers: {
				'Accept': 'application/json',
			},
		});

		if(response.status == 200){	
			let obj = await response.json();
			console.log(obj)
			resolve(obj.token);
		}
	});

}

form_add.addEventListener('submit', async function(event){

	event.preventDefault();

	let csurf_token = await get_csurf_token();

	let response = await fetch(form_add.getAttribute('action'), {
		method: form_add.getAttribute('method'),
		headers: {
			'Content-type': 'application/json',
			'Accept': 'application/json',
			'X-Csrf-Token': csurf_token,
		},
		body: JSON.stringify({
			first_name: form_add.first_name.value,
			last_name: form_add.last_name.value
		})
	});
	console.log(response)
	if(response.status == 200){

		let user = await response.json();
		output.innerHTML = 'В базу данных добавлен новый пользователь: <b>' + user.first_name + ' ' + user.last_name + '</b><br>';

	}
	else{
		output.innerHTML = 'Произошла ошибка!<br>' + response.status + ' ' + response.statusText;
	}

});


Сервер:

app.use(csurf());

app.get('/get_csurf_token', async function(req, res){
	
	let token = req.csrfToken();
	console.log(token);	// Получим строку вида: xmRBPXdh-s8TAuC5xwUt80ocW6hiim9Ow690
	res.send({ token });

});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы