Всем доброго времени суток! Возник такой вопрос, делаю авторизацию для приложения следующим образом:
пользователь заполняет форму (email и password), кнопка submit отправляет данные на сервер при помощи XHR, сервер получает данные, срабатывает функция passport.authenticate('local', {...}), при внесении валидного email и password, функция генерирует JWT, который я передаю в ctx.body для того, что бы при срабатывании события 'load' у функции XHR отработал коллбек, в котором я перехвачу от сервера JWT и сохраню его в localStorage, для того, что бы в последующем при переходе на страничку '/chat' передать мой jwt модулю socketIo-jwt. Проблема возникла в том, что если я в функции passport.authenticate() после передачи JWT вызываю метод ctx.redirect('/chat'), то в функцию XHR на клиенте я получаю не токен, а страничку chat.pug
Подскажите, что я делаю не так или как мне организовать код, что бы на клиент передать токен, и автомитически редиректнуться на следующую страничку?
// сервер
login: async function (ctx, next) {
console.log('мы в функцию логин заходим?');
console.log(ctx.request.body);
await passport.authenticate('local', {session: false}, async function (err, user) {
if (!user) {
console.log(`не видим юзера`);
ctx.redirect('/login');
} else {
console.log(`видим юзера`);
const token = await user.createJWT(user.email, user._id, config.get('JWTSecret'));
ctx.status = 200;
ctx.body = {userName: user.displayName, token: token}; /* если передаю просто ctx.body -- на клиенте получаю токен*/
ctx.redirect('/chat'); /* если оставляю метод ctx.redirect() -- на клиент уходит сам файл chat.pug*/
}
}) (ctx, next);
// клиент
function logIn () {
const candidate = {
email: document.getElementById('inputEmail').value.trim(),
password: document.getElementById('inputPassword').value.trim()
}
let xhr = new XMLHttpRequest();
xhr.open('post', '/login', true);
xhr.setRequestHeader("Content-Type", "application/json");
xhr.addEventListener('load', () => {
const dataFromServer = JSON.parse(xhr.response);
localStorage.setItem('token', dataFromServer.token);
alert(`welcome ${dataFromServer.userName}`);
});
xhr.send(JSON.stringify(candidate));
}