如果用户通过一次身份验证,防止用户再次登录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?的主要内容,如果未能解决你的问题,请参考以下文章

防止 Nuxt 身份验证重定向到 400 状态

视图之间的Django身份验证

Firebase Listener 在某些用户通过电话身份验证登录期间不起作用

登录sql时 window身份验证登录和sqlserver验证登录有啥区别?

如何将已通过身份验证的用户从登录页面重定向到主页

如果用户已经通过登录页面或 auth0 进行了身份验证,我们是不是需要在 websocket 连接中对用户进行身份验证?