您好,
我的服务器使用Node.js和Express。我已经正确设置了cookie-parser
和body-parser
,并且大部分时间我都可以接收和发送Cookie。
因此,我的应用程序实际上非常基础。
seslogin
向idToken and csrfToken
发送Ajax请求。req
中读取cookie。/profile
重定向到window.location.assign('profile')
在我的 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上)