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

Всем доброго времени суток! Возник такой вопрос, делаю авторизацию для приложения следующим образом:
пользователь заполняет форму (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));
    }
  • Вопрос задан
  • 253 просмотра
Решения вопроса 1
EnChikiben
@EnChikiben
редирект вам надо делать на стороне клиента, если пришел токен то делать location = "/chat"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы