Не могу получить куки на бэкэнде - PullRequest
0 голосов
/ 16 сентября 2018

Привет ТАК,

Мой сервер использует Node.js и Express. Я правильно настроил cookie-parser и body-parser и большую часть времени могу получать и отправлять файлы cookie.

Итак, мое приложение на самом деле очень простое.

  1. Представлена ​​страница входа.
  2. Ajax-запрос к seslogin с idToken and csrfToken.
  3. Бэкэнд получает эти токены, и может читать куки с req.
  4. Создает сеансовый cookie и отправляет его клиенту.
  5. Клиент перенаправляет на /profile с window.location.assign('profile')
  6. Обычно бэкэнд читает сессионный cookie, проверяет его и представляет пользовательский интерфейс.

В моем app.ts я могу отлично получать куки в этой части. Я звоню seslogin с Ajax-запросом на мой клиентский скрипт.

app.post('/seslogin', function (req, res) {
    const idToken = req.body.idToken.toString();
    const csrfToken = req.body.csrfToken.toString();

    console.info('[SESLOGIN] Cookies: ', req.cookies);
    console.info('[SESLOGIN] Session Cookie: ', req.cookies.session);

    if (!req.cookies || csrfToken !== req.cookies.csrfToken) {
        res.status(401).send('UNAUTHORIZED REQUEST!');
        return;
    }
    const expiresIn = 60 * 60 * 24 * 5 * 1000;
    if (new Date().getTime() / 1000 - decodedClaims.auth_time < 5 * 60) {
            return admin.auth().createSessionCookie(idToken, { expiresIn: expiresIn });
        }
        throw new Error('UNAUTHORIZED REQUEST!');
    })
        .then(function (sessionCookie) {
            const options = { maxAge: expiresIn, httpOnly: true, secure: true };
            res.cookie('session', sessionCookie, options);
            res.end(JSON.stringify({ status: 'success' }));
        })
        .catch(function (error) {
            res.status(401).send('UNAUTHORIZED REQUEST!');
        });
});

Тем не менее, очень интересно, что в этой части куки не определены

app.get('/profile', function (req, res) {
    // Get session cookie.
    const sessionCookie = req.cookies.session || '';

    console.info('[PROFILE] Cookies: ', req.cookies);
    console.info('[PROFILE] Session Cookie: ', req.cookies.session);

    admin.auth().verifySessionCookie(sessionCookie, true)
    .then(function (decodedClaims) {
        // Serve content for signed in user.
        return serveContentForUser('/profile', req, res, decodedClaims);
    }).catch(function (error) {
        // Force user to login.
        console.error(new Error(error));
        //res.redirect('/login');
        res.redirect('/');
    });
});

client.js (Запрос)

firebase.auth().onAuthStateChanged(function (user) {
    user.getIdToken().then(function (idToken) {
        var csrfToken = getCookie('csrfToken')
        return postIdTokenToSessionLogin('/seslogin', idToken, csrfToken)
            .then(function () {
                // Redirect to profile on success.
                window.location.assign('/profile');
            }, function (error) {
                console.log(error);
                window.location.assign('/login');
            });
    });
});

/ заголовки запроса профиля (на Chrome)

/profile request headers

...