无法在后端接收Cookie

时间:2018-09-16 14:42:50

标签: javascript express web cookies server

您好,

我的服务器使用Node.js和Express。我已经正确设置了cookie-parserbody-parser,并且大部分时间我都可以接收和发送Cookie。

因此,我的应用程序实际上非常基础。

  1. 显示登录页面。
  2. 使用sesloginidToken and csrfToken发送Ajax请求。
  3. 后端收到此令牌,并且可以从req 中读取cookie。
  4. 创建会话cookie并将其发送给客户端。
  5. 客户端使用/profile重定向到window.location.assign('profile')
  6. 通常后端读取会话cookie,对其进行验证并显示一个UI。

在我的 app.ts 中,我可以在此部分完美地接收Cookie。我正在客户端脚本上通过Ajax请求调用seslogin

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!');
        });
});

但是,非常有趣的是,这部分中的cookie是未定义的

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

0 个答案:

没有答案