如果用户通过一次身份验证,防止用户再次登录passportjs?
Posted
技术标签:
【中文标题】如果用户通过一次身份验证,防止用户再次登录passportjs?【英文标题】:Prevent User from logging again in passportjs if they are authenticated once? 【发布时间】:2017-07-16 18:45:21 【问题描述】:我正在使用 PassportJS,注册和登录功能运行得非常流畅。
我在使用 PassportJS 时面临的唯一问题(我也在使用会话),即使用户已经登录,他们也可以再次返回注册/登录 url 并进行注册和/或重新登录!
这很吸引我。如果有人有修复/建议,请记下来。
更新 - 1
myroutes.js
一瞥:(将 PassportJS 与 connet-ensure-login 一起使用。
app.get('*', function(req, res, next)
if (req.url.indexOf('/users/login') < 0 &&
req.url.indexOf('/users/signup') < 0)
req.session.returnTo = null;
next();
);
// =====================================
// HOME PAGE (with login links) ========
// =====================================
app.get('/', sabSettings, function(req, res)
Setting.findOne(function(err, setting)
if (err)
throw err;
// console.log(setting);
res.render('index', title: 'eduBird | Reach the glory', setting: req.setting ); // load the index file
);
);
// =====================================
// LOGIN ===============================
// =====================================
// show the login form
app.get('/login', sabSettings, function(req, res)
// render the page and pass in any flash data if it exists
res.render('login',
message: req.flash('loginMessage'),
errors: req.flash('error'),
title: 'Login | eduBird',
setting: req.setting
);
);
// process the login form
app.post('/login', passport.authenticate('local-login',
successReturnToOrRedirect: '/loggedin',
failureRedirect: '/login',
failureFlash: true
));
// =====================================
// SIGNUP ==============================
// =====================================
// show the signup form
app.get('/signup', sabSettings, function(req, res)
// render the page and pass in any flash data if it exists
process.nextTick(function()
res.render('signup',
message: req.flash('signupMessage'),
errors: req.flash('error'),
title: 'Register | eduBird',
setting: req.setting
);
);
);
// process the signup form
app.post('/signup', passport.authenticate('local-signup',
successReturnToOrRedirect: '/profile/welcome',
failureRedirect: '/signup',
failureFlash: true
));
【问题讨论】:
你能提供你的代码 Animesh 吗? 告诉我这是否能解决您的问题 @Kudzai 它确实奏效了。谢谢。 【参考方案1】:您尚未创建任何类型的访问控制,但不用担心,我们将首先了解 Passport 的工作原理并使用它来解决问题。
-
当用户提交登录表单时,会向我们指定的路径发出 POST 请求,从而执行 passport.authenticate。
该路由的身份验证中间件配置为处理本地策略,passport 将调用您的本地策略实现。
如果在与我们的数据库交互时发生错误,我们会调用 done(err)。否则,如果找不到用户或密码不匹配,我们调用 done(null, false)。如果成功,我们调用 done(null, user)。
调用 done 会将我们返回到 passport.authenticate 并执行相应的重定向。
此时,如果登录成功,用户对象(来自 done(null, user))被附加到 request 中,您可以通过 访问用户对象req.user.
主要思想是如果用户对象没有附加到请求上,则意味着用户没有登录,所以我们可以控制我们的应用程序登录行为 具有 req.user 的用户。例如:
// If the user object does not exist it means the user is not logged in
if (!req.user)
res.render('signin');
else
// If the user object exists, the user is logged in and if they try to log in we redirect them to the home page
return res.redirect('/');
我希望这会有所帮助。
【讨论】:
它就像一个魅力,非常简单,甚至有这样限制主页的想法,谢谢! hii Kudzai 代码工作正常,但我想整合会话等待到期时间我该怎么做。提前致谢。 @Nodejs 这更像是一个快速会话,使用 cookie 的 maxAge 属性设置会话到期。速递中有很好的说明documentation 您好,感谢 Kudzai 的回复,您能帮我了解一下 serializeUser、deserializeUser 函数的工作原理以及它们在整个过程中调用的时间。 如果我双击它会返回登录页面。以上是关于如果用户通过一次身份验证,防止用户再次登录passportjs?的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Listener 在某些用户通过电话身份验证登录期间不起作用
登录sql时 window身份验证登录和sqlserver验证登录有啥区别?
如果用户已经通过登录页面或 auth0 进行了身份验证,我们是不是需要在 websocket 连接中对用户进行身份验证?