Как я могу добавить новое условие для «подтвержденных» пользователей, выполняющих вход с помощью passport.js? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь добавить условное выражение в passport.js, которое также проверяет, подтверждена ли учетная запись или нет, вставляя «заявление if» внизу кода после проверки электронной почты и пароля пользователя.

Я попробовал несколько способов добавить оператор if в последнюю часть кода в функции 'LocalStrategy' и попытался переработать все это с помощью операторов elif и else.Я получаю сообщение «Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту» и другие ошибки, как показано ниже.

Боюсь, я не могу предоставить весь код для вас, чтобыВоспроизведите это.
Если у вас нет фиктивной страницы с надписью и mongodb, на котором запущен passport.js, а учетная запись с правдоподобным или похожим на user.confirmed предназначена для моей учетной записи.

  const LocalStrategy = require('passport-local').Strategy;
  const mongoose = require('mongoose');
  const bcrypt = require('bcryptjs');

  // Load User model
  const User = require('../models/User');

  module.exports = function(passport) {
    passport.use(
      new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
        // Match user
        User.findOne({
          email: email
        }).then(user => {
          if (!user) {
            return done(null, false, { message: 'That email is not registered' });
          }
          // Match password
          bcrypt.compare(password, user.password, (err, isMatch) => {
            if (err) {
              console.log(err);
              res.sendStatus(500);
              return;
          } if (isMatch) {
              return done(null, user);
            } else {
              return done(null, false, { message: 'Password incorrect' });
            }
          });
          // LINES I'M TRYING TO ADD HERE BELOW

            if (!user.confirmed) {
              return done(null, false, { message: 'This account is not confirmed' });
          // LINES I'M TRYING TO ADD HERE ABOVE
            }
        });
      })
    );

    passport.serializeUser(function(user, done) {
      done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
      User.findById(id, function(err, user) {
        done(err, user);
      });
    });
  };

В моемУстановка приведенного выше кода находится в файле конфигурации как passport.js и используется js-файлом в папке «маршруты», в которой пользователь регистрируется с помощью

router.post('/login', (req, res, next) => {
  passport.authenticate('local', {
    successRedirect: '/dashboard',
    failureRedirect: '/users/login',
    failureFlash: true
  })(req, res, next);

Поле «подтверждено» либо «истинно»или «ложь».Читайте с! User.confirmed.(Процесс подтвержденного или! Подтвержденного обрабатывается с помощью ссылки, отправляемой на электронную почту пользователя. Это выходит за рамки моей проблемы, но я делюсь информацией, если это помогает решить проблему.)

Я хотел бы получить паспорт.Чтобы проверить учетную запись с помощью электронной почты, существует правильный пароль, ТОГДА разрешите пользователю войти в систему ТОЛЬКО, если учетная запись подтверждена как «истина», и опубликуйте сообщение о том, что учетная запись не подтверждена, и отклоните запись, если она не подтверждена.

Я не могу добавить подтвержденную проверку без ошибок и потерять другие проверки для вещей.С этой текущей настройкой он говорит вам, если электронная почта НЕ зарегистрирована.Он сообщает вам, если пользователь НЕ подтвержден, но вылетает, если вы ввели неправильный пароль с зарегистрированным адресом электронной почты.

1 Ответ

2 голосов
/ 26 апреля 2019

Так что, если я что-то упустил

bcrypt.compare(password, user.password, (err, isMatch) => {
  if (err) {
    console.log(err);
    res.sendStatus(500);
    return;
  }

  if (isMatch && user.confirmed) {
    return done(null, user);
  } else if (isMatch) {
    return done(null, false, { message: 'This account is not confirmed' });
  } else {
    return done(null, false, { message: 'Password incorrect' });
  }
});

Доступны другие перестановки.

...