由于中间件,nodejs 护照未注销
nodejs passport not logging out because of middleware
我正在使用 nodejs、express、mongoose 和 passport npm 制作一个 webapp。
早些时候我的登录和注销功能运行良好,但现在我不得不添加一个功能来检查用户是高级用户还是普通用户。
所以我制作了一个中间件,现在导致注销出现问题。
这是我的代码。
在我的 index.js 文件中,每秒调用 /matchData 上的 ajax 请求以根据用户类型获取数据。
//ajax routes for json response
router.get('/matchData', isPremium);
//middleware causing problem
function isPremium(req,res,next){
if(req.isAuthenticated()){
if(req.user.type=='premium'){
console.log("user is premium");
Match.getMatchLatestData(function(err,match){
if(err) throw err;
res.send(match[0]);
});
}else{
console.log("user is loggedin but not premium");
Match.getMatchData(function(err,match){
if(err) throw err;
res.send(match[0]);
});
}
}else{
console.log("user not logged in");
Match.getMatchData(function(err,match){
if(err) throw err;
res.send(match[0]);
});
}
}
在我的user.js中,我的登录和注销功能如下
//Login Routes
router.get('/login',isAuthenticated2, function(req, res, next) {
res.render('user/login',{
title:'login'
});
});
router.post('/login',isAuthenticated2, passport.authenticate('local',{failureRedirect:'/users/login', failureFlash:'Invalid Email Id or Password'}),function(req,res){
console.log('Authentication Successful');
req.flash('success','You are logged in.');
res.redirect('/');
});
//logout route
router.get('/logout',isAuthenticated,function(req,res){
req.logout();
req.flash('success','You have logged out');
res.redirect('/');
});
function isAuthenticated(req, res, next) {
if(req.isAuthenticated())
return next();
else{
req.flash('error','Please Login First')
res.redirect('/users/login');
}
}
function isAuthenticated2(req, res, next) {
if(req.isAuthenticated()){
req.flash('info','You are already logged in.')
res.redirect('/');
}
else
return next();
}
现在的问题是当我注销时它显示 flash msg successful 但在我的控制台中它仍然显示我已登录但不是 premium 或者我是 premium,这是我登录的唯一情况。
而不是使用 req.logout()
尝试使用下面的代码片段
req.session.destroy(function (err) {
res.redirect('/');
});
尝试在节点中使用此代码,我们在登录后为用户设置会话,销毁它会注销用户
//logout route
router.get('/logout',function(req,res){
req.session.user = '';
res.redirect('/login'); // redirect wherever required
});
我遇到了类似的问题并从 http://www.passportjs.org/docs/logout/
找到了答案
app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
或者如果您有注销页面。
app.get('/logout', function(req, res){
req.logout();
res.render('logout', {
title: "Moi moi!"
});
});
我正在使用 nodejs、express、mongoose 和 passport npm 制作一个 webapp。
早些时候我的登录和注销功能运行良好,但现在我不得不添加一个功能来检查用户是高级用户还是普通用户。 所以我制作了一个中间件,现在导致注销出现问题。 这是我的代码。
在我的 index.js 文件中,每秒调用 /matchData 上的 ajax 请求以根据用户类型获取数据。
//ajax routes for json response
router.get('/matchData', isPremium);
//middleware causing problem
function isPremium(req,res,next){
if(req.isAuthenticated()){
if(req.user.type=='premium'){
console.log("user is premium");
Match.getMatchLatestData(function(err,match){
if(err) throw err;
res.send(match[0]);
});
}else{
console.log("user is loggedin but not premium");
Match.getMatchData(function(err,match){
if(err) throw err;
res.send(match[0]);
});
}
}else{
console.log("user not logged in");
Match.getMatchData(function(err,match){
if(err) throw err;
res.send(match[0]);
});
}
}
在我的user.js中,我的登录和注销功能如下
//Login Routes
router.get('/login',isAuthenticated2, function(req, res, next) {
res.render('user/login',{
title:'login'
});
});
router.post('/login',isAuthenticated2, passport.authenticate('local',{failureRedirect:'/users/login', failureFlash:'Invalid Email Id or Password'}),function(req,res){
console.log('Authentication Successful');
req.flash('success','You are logged in.');
res.redirect('/');
});
//logout route
router.get('/logout',isAuthenticated,function(req,res){
req.logout();
req.flash('success','You have logged out');
res.redirect('/');
});
function isAuthenticated(req, res, next) {
if(req.isAuthenticated())
return next();
else{
req.flash('error','Please Login First')
res.redirect('/users/login');
}
}
function isAuthenticated2(req, res, next) {
if(req.isAuthenticated()){
req.flash('info','You are already logged in.')
res.redirect('/');
}
else
return next();
}
现在的问题是当我注销时它显示 flash msg successful 但在我的控制台中它仍然显示我已登录但不是 premium 或者我是 premium,这是我登录的唯一情况。
而不是使用 req.logout()
尝试使用下面的代码片段
req.session.destroy(function (err) {
res.redirect('/');
});
尝试在节点中使用此代码,我们在登录后为用户设置会话,销毁它会注销用户
//logout route
router.get('/logout',function(req,res){
req.session.user = '';
res.redirect('/login'); // redirect wherever required
});
我遇到了类似的问题并从 http://www.passportjs.org/docs/logout/
找到了答案app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
或者如果您有注销页面。
app.get('/logout', function(req, res){
req.logout();
res.render('logout', {
title: "Moi moi!"
});
});