Правильные ответы в формате json при использовании passport.js ?

#javascript #mongodb #express #authentication

#javascript #mongodb #выражать #аутентификация #выразить

Вопрос:

Я использую Passport.js для аутентификации в API Express 4. В основном все работает нормально, но я обнаружил, что отправка правильных ответов json, т. Е. Сообщений об ошибках или объектов, затруднена с помощью passport. Например, это мое LocalStrategy для входа в систему:

   passport.use (
    'login',
    new LocalStrategy (
      {
        usernameField: 'email',
      },
      (email, password, done) => {
        User.findOne ({email: email}, (err, foundUser) => {
          if (err) return done (err);

          if (!foundUser) {
            return done (null, false, {
              message: 'Invalid Username.',
            });
          }

          if (!foundUser.comparePassword (password)) {
            return done (null, false, {
              message: 'Invalid Password.',
            });
          }

          return done (null, foundUser);
        });
      }
    )
  );
  

Я настраиваю пользовательские message значения для случаев сбоя аутентификации, но эти сообщения никогда не отображаются в моих ответах api. Как мне отправлять подобные сообщения, если что-то пойдет не так во время аутентификации?

 app.post (
  '/signup',
  passport.authenticate ('signup', {
    successRedirect: '/user',
    failureMessage: true,
    successMessage: true,
  })
);
  

Более того, вместо установки перенаправлений типа successRedirect я хочу отправлять правильные ответы json для каждого случая, и если возникает ошибка, я хочу отправить это как объект json вместо перенаправления на маршрут. Как я могу это сделать?

Ответ №1:

Попробуйте использовать async await здесь.

 passport.use(
  'login',
  new LocalStrategy(
    {
      usernameField: 'email',
      passwordField: 'password',
    },
    async (email, password, done) => {
      try {
        const user = await User.findOne({ email });
        // now if user exists it will give the whole document if not then null, now you can test your conditions based on this user flag /
      } catch (error) {
        done(error);
      }
    },
  ),
);

  

в последнем случае, о котором вы упомянули, вы можете отправить ответ в виде

 app.post('/signup', passport.authenticate('login'), (req, res) => {
  res.status(200).json({
    message: 'Your message here',
    user: req.user,
  });
});

  

здесь это должен быть login in passport.authenticate('login') поскольку вы используете локальную стратегию, используя login в приведенном выше коде.

Комментарии:

1. Это не то, чего я хочу. Я спрашиваю, как мне отправить message объекты, которые я передаю в методе done, например: ` if (!foundUser) { return done (null, false, { message: ‘Недопустимое имя пользователя.’, }); }` клиенту в виде ответов json в случае сбоя аутентификации где-либо.