我正在尝试使用节点js和express编写中间件。如果用户未经过身份验证,则会将其重定向到登录页面。
这是有效的,但一旦重定向到登录页面,它会一次又一次地重定向到登录页面。
app.get('/profile',function(req,res){
if (isAuthenticated()) {
res.sendFile(path.join(__dirname+'/site/profile.html'));
}else{
console.log('not authenticated user at profile');
res.redirect('/login');
}
});
登录
app.get('/login',function(req,res){
if (isAuthenticated()) {
res.redirect('/profile');
}else{
res.sendFile(path.join(__dirname+'/login.html'));
}
});
编辑:
控制台(循环):未在配置文件中经过身份验证的用户
用于身份验证的Firebase方法
function isAuthenticated(){
var user = firebase.auth().currentUser;
console.log(user);
if(user && user !== null){
return true;
}else{
return false;
}
}
返回null
答案 0 :(得分:2)
我不会使用重定向,而是编写authenticationRequired
中间件。此中间件将发送401
状态代码并显示登录页面,或将请求传递给下一个回调。
function authenticationRequired(req, res, next) {
if( isAuthenticated() ) {
next()
} else {
res.status(401).sendFile(path.join(__dirname, 'login.html'));
}
}
// register the middleware for only one route
app.get('/profile', authenticationRequired, function(req,res) {
res.sendFile(path.join(__dirname, 'site/profile.html'));
});
// or register the middleware for all routes that follow
app.use(authenticationRequired)
app.get('/profile', function(req,res) {
res.sendFile(path.join(__dirname+'/site/profile.html'));
});
这样您就不需要手动跟踪用户在第一种情况下尝试打开的网址,登录后用户将保留在正确的网址上。
除此之外,您将使用正确的状态代码,而不是302
,它告诉浏览器资源在您发送401
的其他地方是临时的,告知浏览器需要进行身份验证显示请求的资源。