【问题标题】:Can I pass my own data (object) back from passport.use('local') to passport.authenticate?我可以将自己的数据(对象)从passport.use('local')传回passport.authenticate吗?
【发布时间】:2019-08-20 22:11:11
【问题描述】:

我想将自己的数据从 passport.use 传递到 passport.authenticate。

我以为 info 参数在 passport.authenticate('local', function(err, user, info) 可以用于此。

那么有没有办法做到这一点?

我的认证路线

    passport.authenticate('local-register', (err, user, info) => {
      if (err) {
        return next(err); // 500 status
      }
      console.log(info);
      if (info) {
        console.log('rendering info ' + info);
        return res.render('auth/register', { info });
      } else {
        if (!user) {
          return res.status(409).render('auth/register');
        }
        req.login(user, err => {
          if (err) {
            console.log(err);
            return next(err);
          }
          return res.redirect('auth/profile');
        });
      }
    })(req, res, next);
  });

我的配置文件

module.exports = passport => {
  passport.use(
    'local-register',
    new LocalStrategy(
      {
        ...
      },
      (req, email, password, done) => {
        // Check if form is filled out correctly
        let errors = [];

        //check for same email
        SCUser.findOne({ 'local.email': req.body.email }, (err, local) => {
          if (local) errors.push({ text: 'Email already in use.' });

          //check for same passwords
          ...

          //check for password length
          ...

          //abort if errors are found
          if (errors.length > 0) {
            const info = {
              errors: errors,
              ...,
            };
            console.log(`returning info ${info}`);
            return done(null, info);
          }

          //form is filled in correctly create a user
          else {
          ...
          }
       ...

到目前为止我尝试过的随机事物:

info 后面添加, form_validate 并将所需变量更改为form_validate 不会将其传递给身份验证文件。

可能有更好的方法来处理表单验证,还没有查到,如果您有任何建议请告诉我,但我仍然想知道是否可以通过护照方法传递自定义对象.

【问题讨论】:

  • 根据文档,您可以在成功时传递用户对象,在失败时传递信息对象。你真的试过看看吗?首先进行实验,如果您有问题,然后将它们发布到 SO。 passportjs.org/docs/authenticate
  • @Pop-A-Stash `` 将传递一个可选的信息参数,其中包含策略的验证回调提供的其他详细信息。`` 信息不是在失败时传递,而是在验证回调中传递?
  • 你到底想做什么?我看到提到了“表单验证”。护照与该任务完全无关;它仅用于对用户进行身份验证。

标签: javascript node.js passport.js


【解决方案1】:

查看文档中的示例:

passport.use(new LocalStrategy(
  function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) {
        return done(null, false, { message: 'Incorrect username.' });
      }
      if (!user.validPassword(password)) {
        return done(null, false, { message: 'Incorrect password.' });
      }
      return done(null, user);
    });
  }
));

如果您确定用户名/密码不正确,您可以调用done,最后一个参数是您希望的任何对象

return done(null, false, { message: "Incorrect password", otherData: "my other data"});

而且,如果成功,你可以传递用户,但没有理由不能向用户添加更多数据,或者传递完全不同的东西。

return done(null, {username: "user123", otherData: myData, customString: "myString"});

【讨论】:

  • 谢谢你帮助我:)
猜你喜欢
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 2018-06-06
  • 2017-10-09
相关资源
最近更新 更多