У меня есть устаревший сайт, который я не могу изменить. Это ASP.Net MVC, и / login возвращает представление с формой входа и токеном CSRF.
Я настроил приложение React, в котором я хочу иметь форму, позволяющую пользователю войти в систему на стороне реакции и создать сеанс в браузере, чтобы я мог перенаправить его на устаревший сервер (с пользователемуже вошли в систему).
Поэтому я использую запрос get, чтобы получить /login.
Затем я анализирую ответ HTML и получаю токен CSRF.
Наконец я публикую /войти с именем пользователя, электронной почтой и токеном. Я протестировал этот поток с помощью PostMan, и все это работает, как и ожидалось.
Однако на странице React появляется ошибка 500 (токен не работает).
Возможно ли то, что я пытаюсь?
Вот код:
** Получить форму для входа
getLogin = () => {
const { email, password } = this.state;
return new Promise((resolve, reject) => {
fetch('...../login', {
method: 'get',
headers: {
'Accept': 'text/plain, */*',
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
}
})
.then(res => res.text())
.then((res) => {
resolve(res)
this.setState({output: res})
})
});
}
** Получить токен
parseHTML = (html) => {
return new Promise((resolve, reject) => {
const parser = new htmlparser2.Parser({
onopentag(name, attribs) {
if (name === "input" && attribs.name === "__RequestVerificationToken") {
const token = attribs.value;
resolve(token)
}
},
},
{ decodeEntities: true }
);
parser.write(html);
parser.end();
})
}
** Сообщение для входа
login = () => {
const { email, password, token } = this.state;
var formData = new URLSearchParams();
formData.append('email', '......');
formData.append('password', '......');
formData.append('__RequestVerificationToken', token.replace(/\s/g, ""));
const targetUrl = 'http://localhost:65055/login';
fetch(targetUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
},
body: formData
})
.then(res => res.text())
.then(res => this.setState({output: res}));
}