在我的Web应用程序中,有一个页面“ interfacePage”,我想限制对该页面的访问(服务器端)。因此,每次调用页面时,我都会使用一个函数来从客户端Cookie中获取Firebase会话Cookie,然后再检查其有效性。如果有效,则显示interfacePage,否则显示登录页面。
代码段
function isAuthenticated(req, res, next){
try {
var sessionCookie = req.cookies.session;
console.log(sessionCookie);
admin.auth().verifySessionCookie(sessionCookie, true)
.then(function(decodedClaims){
console.log("token verified");
next()
})
.catch(function(error){
console.log(error);
res.redirect('/users/login');
});
}catch (err)
{
console.log(err);
}
};
router.get('/interfacePage', isAuthenticated,function (req, res, next) {
//isAuthenticated is called when this get is called. If next() is called from isAuthenticated, then function (req, res, next) is called which renders page
res.render('interfacePage');
});
此代码在本地完全可以正常运行。但是,一旦我部署了它并通过Firebase控制台启动了应用程序,无论何时我请求interfacePage,它都会一直给我网关超时错误。我想可能是
admin.auth().verifySessionCookie(sessionCookie, true)
由于某种原因花了太长时间做出回应。
我们将不胜感激。
答案 0 :(得分:0)
好吧,很明显,firebase会剥离所有饼干,但名称为“ __session”的饼干除外。我将cookie的名称从session更改为__session,现在可以使用了。
答案 1 :(得分:0)
如果您使用 Firebase Hosting + Cloud Functions,则 __session 是您设计的唯一可以存储的 cookie。这对于我们能够有效地在 CDN 上缓存内容是必要的——我们从请求中去除 __session 以外的所有 cookie。这应该记录在案,但似乎不是(哎呀!)。我们将更新文档以反映此限制。
此外,您需要将 Cache-Control Header 设置为私有
res.setHeader('Cache-Control', 'private")