Passportjs防止注册后自动登录

Passportjs PREVENT auto-login after signing up

本文关键字:登录 注册 Passportjs      更新时间:2024-02-27

使用passportjs进行身份验证。当用户注册时,我希望出现一条消息,让他们知道他们现在可以使用自己的帐户登录了。截至目前,注册也会将它们登录,从而关闭我的通知:

  • "您现在可以注册了"
  • "您已登录"

  • "欢迎新用户"

我该如何防止这种情况发生?我在verifySignup()结束时尝试了req.logout(),但没有骰子。

我的路由器:

  router.route('/login')
  .get(function(req, res){
    // If the user is already logged in, redirect them to the dashboard
    if(req.isAuthenticated()) {
      req.flash('alert', 'You are already logged in');
      res.redirect('/');
    } else {
      // Otherwise, allow them to login
      // Redirect them to the login pages
      res.render('login',
      { host: req.baseUrl,
        error: req.flash('error'),
        success: req.flash('success'),
        alert: req.flash('alert')
      });
    }
  }).post(passport.authenticate('local-login', {
        successRedirect: '/',
        failureRedirect: '/login',
        badRequestMessage: "You need to enter your username and password",
        failureFlash: true // allow flash
      })
  );
  router.route('/signup')
    .get(function(req, res){
      // If the user is already logged in, redirect them to the dashboard
      if(req.isAuthenticated()) {
        req.flash('alert', 'You must first log out before signing up for a new account');
        res.redirect('/');
      } else {
        // Otherwise, allow them to signup
        // Redirect them to the signup pages
        res.render('signup',
        { host: req.baseUrl,
          error: req.flash('error'),
          success: req.flash('success'),
          alert: req.flash('alert')
        });
      }
    }).post(passport.authenticate('local-signup', {
          successRedirect: '/login',
          failureRedirect: '/signup',
          badRequestMessage: "You must fill in all of the form fields.",
          failureFlash: true // allow flash
        })
    );

防止自动登录的两种方法:

1.在passport.authenticate中提供可选回调。示例。。。

      router.post('/signup', function(req, res, next) {
        /* ... */
        passport.authenticate('local-signup', function(err, user, info) {
          if (err) { return next(err) }
          if (!user) { return res.redirect('/signup') }
          res.redirect('/login');
        })(req, res, next);
      });

注意:如果提供回调,它将成为应用程序的负责登录用户、建立会话以及以其他方式执行所需操作。

在本例中,既不进行登录,也不进行会话存储。因此,阻止了自动登录。

2.更简单的解决方案。使用选项session: false禁用使用会话。

.post(passport.authenticate('local-signup', {
              successRedirect: '/login',
              failureRedirect: '/signup',
              badRequestMessage: "You must fill in all of the form fields.",
              failureFlash: true, // allow flash,
              session: false // prevent auto-login
            })

使用此解决方案,会话实例中不会存储任何用户信息,因此重定向到/login会正确通知"您现在可以使用您的帐户登录"。