【问题标题】:How to get failureFlash to show flash message in Passport.js local strategy?如何在 Passport.js 本地策略中获取 failureFlash 以显示 flash 消息?
【发布时间】:2021-11-06 21:10:06
【问题描述】:

我正在尝试使用 passport.js 实施本地护照策略

我希望这样当用户尝试使用已被占用的电子邮件注册时,它会闪烁一条消息“该电子邮件已被占用”。

我已经添加了failureFlash: true 行,但我如何才能访问 Flash 消息,以便真正让它出现在屏幕上?

我对这一切都很陌生,所以任何帮助都会很棒。

passport.js:

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const User = mongoose.model('users');

passport.serializeUser((user, done) => {
  console.log('serialize:', user.id);
  done(null, user.id);
});

passport.deserializeUser((id, done) => {
  User.findById(id).then(user => {
    console.log('deserialize:', user);
    done(null, user);
  });
});

// Local signup strategy
passport.use('local-signup', new LocalStrategy(
  {
    usernameField: 'email',
    passwordField: 'password',
    passReqToCallback: true
  },
  (req, email, password, done) => {
    User.findOne({ 'local.email': email }, (err, user) => {
      if (err) { return done(err); }

      if (user) {
        console.log('user error:', user);
        return done(null, false, req.flash('signUpMessage', 'That email is already taken.'));
      } else {
        new User({
          'local.email': email,
          'local.password': password
        })
        .save()
        .then(user => {
          done(null, user)
        })
        .catch(err => {
          console.log('error:', err);
          done(err);
        });
      }
    });

  }
));

authRoutes.js:

const passport = require('passport');

module.exports = app => {
  app.post(
    '/api/signup',
    passport.authenticate('local-signup', {
      failureFlash: true
    }),
    (req, res) => {
      console.log('request:', req);
      console.log('flash msg:', req.flash('signUpMessage'));
      res.send(req.user);
    }
  );

  app.get('/api/current_user', (req, res) => {
    console.log('current_user:', req.user);
    res.send(req.user);
  });

  app.get('/api/logout', (req, res) => {
    req.logout();
    res.redirect('/');
  });
};

Github:https://github.com/drhectapus/voting-app

【问题讨论】:

  • 你得到答案了吗?如果是这样,你能在这里写一个答案吗?

标签: node.js passport.js flash-message


【解决方案1】:

我觉得你可以的

console.log('flash msg:', req.flash('error'));

failureFlash: req.flash('error');

【讨论】:

  • failueFlash: true 应该自动用适当的 flash 消息填充请求,对吧?我们需要自己写吗?
【解决方案2】:

done 回调中,您可以传递这样的错误消息 - return done(null, false, { message: 'User exists!' }) 并确保在您的路由器中将 failureFlash 设置为 true,例如

router.get('/google/callback', passport.authenticate('google',
{
        failureRedirect: '/',
        failureFlash: true,
        session: false,
}),

您的视图中将显示错误消息messages.error

【讨论】:

    【解决方案3】:

    我知道这太晚了,但这对我有用

    首先,您需要要求并设置闪存:

    var flash = require('connect-flash');
    

    然后,通过 express 使用:

    app.use(flash());
    

    最后,使用ejs作为你的视图引擎来显示消息

    app.use('view engine', 'ejs');
    
    app.get('/login', function(req,res) {
    res.render('login', {message: req.flash('message')});
    });
    

    在您的模板中显示:

    <%= message %>
    

    这不完全是代码(呃!),但它会给你一些修复你的想法!干杯!

    【讨论】:

      【解决方案4】:

      在你的例子中,

      return done(null, false, req.flash('signUpMessage', 'That email is already taken.'));
      

      应该替换为

      return done(null, false, {type:'signUpMessage', message: 'That email is already taken'});
      

      护照本身会为您拨打req.flash()

      假设您已经设置了connect-flash 并且您确认您已经可以显示除了护照闪烁之外的闪烁,那么您有 3 个选项:

      failureFlash: true

      在这种情况下,当您调用done(null, false, {type: 'info', message: 'my message'}) 时,passport 将使用typemessage 并使用它来调用req.flash(type, message),如果您没有指定type,那么passport 将默认为@987654332 @闪光。

      在下面的示例中,有两个可能的消息可以闪烁username not found!incorrect password,注意我们没有通过 typedone(null, false, {...} 中,所以所有 flash 都将“继承”error flash 类型:

       passport.use('login', new LocalStrategy(function(username, password, done) {
              // we need to call done(null, user) if authenticated
              // or done(null, false, {message: "invalid username/password"}) if can't authenticate
              User.findOne({username: username}, function(err, user) {
                  if (err) { done(err); }
                  if (!user) { 
                      return done(null, false, {message: "username not found!"});
                  }
                  user.checkPassword(password, function(err, result) {
                      if (err) { return done(err);}
                      if (result) { 
                          return done(null, user);
                      }
                      return (null, false, {message: 'incorrect password'});
                  } )
              })
          }));
      

      failureFlash:“一些通用消息”

      这将忽略您在done(null, false, {...} 中传递的任何{type: xxx, message: yyy},它等效于在所有done(null, false, ...) 中使用{type: "error", "message": "some generic message"}

      failureFlash: { "type": "info" }

      这会将所有消息的闪存类型覆盖为info。因此,无论type 是通过调用done(null, false, {type: "myflashtype", message: "my message"} 指定的,都将被有效地覆盖到 req.flash('info', 'my message')

      我认为 passport.js docs 中没有特别详细地记录这一点,但您可以通过查看 passport source code 的这一部分来找到详细信息

      【讨论】:

        猜你喜欢
        • 2019-11-05
        • 1970-01-01
        • 2017-06-11
        • 2016-04-15
        • 2014-03-20
        • 2021-08-19
        • 2020-03-16
        • 2018-11-10
        • 2015-01-01
        相关资源
        最近更新 更多