Правильные ответы json при использовании passport.js? - PullRequest
0 голосов
/ 22 апреля 2019

Я использую Passport.js для аутентификации в Express 4 API. В основном все работает нормально, но я обнаружил, что отправка правильных ответов json, т.е. сообщений об ошибках или объектов, с паспортом затруднена. Например, это мой 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 s для случаев, когда аутентификация не удалась, но эти сообщения никогда не отображаются в моих ответах API. Как мне отправлять подобные сообщения, если во время аутентификации что-то идет не так?

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

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

1 Ответ

0 голосов
/ 22 апреля 2019

Попробуйте использовать 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,
  });
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...