我有一个小问题,这似乎很简单,但是我似乎无法全神贯注于该做什么。
我有一个快速应用程序,它使用Firebase来存储数据。我可以通过客户端脚本登录,注册和注销,但是我的问题是:如何通过express检查用户是否登录,以便能够向登录的用户发送不同的页面?
到目前为止,这是我的代码:
var firebase = require('firebase');
// Initialize Firebase
var config = {
serviceAccount: "./Chat Application-ad4eaaee3fcc.json",
databaseURL: "MY_DATABASE_URL"
};
firebase.initializeApp(config);
然后我想为登录的用户显示一个特殊页面,这是我尝试过的:
router.get("/special-page", function(req, res, next) {
var user = firebase.auth().currentUser;
console.log(user); // this variable gets undefined
if(user) {
res.render("special-page");
} else {
res.redirect("/");
}
});
我知道这似乎是一个简单的问题,但是任何帮助将不胜感激!
提前致谢。
用户端和服务器端是完全不同的执行区域。因此,您可能已经猜到了,firebase.auth().currentUser
如果客户端上进行了身份验证,则无法在服务器上进行调用。
除非客户端告诉他,否则服务器进程只是没有此信息。
您可能只有一个请求标头,告诉我“我被记录为XXX”,但这并不安全,因为服务器将无法验证该信息,并且恶意用户可能会伪装成另一个用户。
在您的用例中,对此的唯一解决方案是向服务器提供Firebase令牌,然后服务器需要针对Firebase服务器验证此令牌,只有这样,它才能100%确定客户端身份验证。
我需要在我的React应用程序中进行服务器端渲染,这是我的方法。
客户端代码:
const setAppCookie = () => firebase.auth().currentUser &&
firebase.auth().currentUser.getToken().then(token => {
cookies.set('token', token, {
domain: window.location.hostname,
expire: 1 / 24, // One hour
path: '/',
secure: true // If served over HTTPS
});
});
const unsetAppCookie = () =>
cookies.remove('token', {
domain: window.location.hostname,
path: '/',
});
// triggered by firebase auth changes, this is where you deal
// with your users authentication in your app
fbAuth.onAuthStateChanged(user => {
if (!user) {
// user is logged out
return;
}
// user is logged in
setAppCookie();
// Reset cookie before hour expires
// (firebase tokens are short lived, say the docs)
setInterval(setAppCookie, 3500);
});
[...]
// In the logout code
unsetAppCookie();
服务器中的代码:
// Before serving express app, enable cookie parsing
app.use(cookieParser());
// In the code dealing with your requests
const { token } = req.cookies;
if (!token) {
// renderWithoutUser();
}
//
// If user found in cookie, verify the token and render with logged in store
//
console.log('Verifying token', token);
firebase.auth().verifyIdToken(token)
.then(decodedToken => {
const uid = decodedToken.sub;
console.log('User is authenticated for this request', uid);
// renderWithUser();
})
.catch(err => {
console.error('WARNING token invalid or user not found', err);
// renderWithoutUser();
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句