Почему passport.authenticate не звонит? - PullRequest
1 голос
/ 07 апреля 2020

это мой первый вопрос, и я устала искать ... возможно, это ошибка новичка, но я пробовала все, чтобы ее решить, но не нашла ответа.

Я создал новую локальную стратегию для паспорта следующим образом:

passport.use(new LocalStrategy({
    usernameField: "username",
    passwordField: "password"
  }, async (username, password, done) => {

    const user = await User.findOne({username: username});

    if (!user) {
      return done(null, false, { message: 'Este usuario no existe.' });
    } 
    else {
      const match = await user.matchPassword(password);
      if(match) {
        return done(null, user);
      } else {
        return done(null, false, { message: 'Usuario/Contraseña no correctos.' });
      }
    }
  }));

И вот как я его называю:

router.post("/users/login", async (req, res) => {
    dni = req.body.username;
    usuario = await User.findOne({username: dni});
    idUser = usuario._id;
    configuracion = await Config.findOne({idUsuario: idUser});
    delStatus = configuracion.deleteStatus;
    banStatus = configuracion.banStatus; 
    if(configuracion){
        if(banStatus){
            req.flash("errors_msg", "Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información");
            res.redirect("/");
        }
        else if(delStatus){
            req.flash("errors_msg", "Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte");
            res.redirect("/");
        }
        else{
            passport.authenticate("local", function (user, error, info) {
                console.log("2");
                console.log(info);
                if(error){
                    console.log(error);
                    req.flash("errors_msg", "ERROR: Usuario o contraseña incorrectos")
                    res.redirect("/users/login");
                }
                if(!user){
                    req.flash("errors_msg", "ERROR: Usuario o contraseña incorrectos")
                    res.redirect("/users/login");
                }
                req.logIn(user, function (err) {
                    if(error){
                        return next(err);
                    }
                    res.redirect("/");
                })
            });
        }
    }
    else{
        if(usuario){
            id = consultaUsuario._id;
            res.redirect("/users/verify?=" + id);
        }
        else{
            req.flash("errors_msg", "Este usuario no existe, registrese o en caso de error, consulte con nuestro servicio de atención al cliente");
            res.redirect("/users/register");
        }
    }
});

Но паспорт не запускается в любом случае ...

Кто-нибудь может мне помочь? Заранее спасибо!


Редактировать 1:

@ davidmwhynot, это самое точное:

LocalStrategy:

passport.use(new LocalStrategy({
    usernameField: "username",
    passwordField: "password",
    passReqToCallback: true
  },  async (res, username, password, done) => {

    const user = await User.findOne({username: username});
    idUsuario = user._id;
    const configuracion = await Config.findOne({idUsuario: idUsuario});
    if(configuracion){
      if (configuracion.banStatus) {
        return done(null, false, { message: "Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información"});
      }
      if (configuracion.deleteStatus) {
        return done(null, false, { message: "Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte"});
      }
    }
    if (!user) {
      return done(null, false, { message: 'Este usuario no existe.' });
    } 
    else if(!configuracion){
        user.isConfig = false;
        return user;
    }
    else {
      const match = await user.matchPassword(password);
      if(match) {
        return done(null, user);
      } else {
        return done(null, false, { message: 'Usuario/Contraseña no correctos.' });
      }
    }
  }));

И это код для входа в систему:

    router.post("/users/login", passport.authenticate('local', {
    successRedirect: '/',
    failureRedirect: '/users/login',
    failureFlash: true
}), async (req, res) => {
         // This is not executed anyway, can´t see any param or even see a 
        //console.log
});

Я много чего пробовал, но ... никто не увенчался успехом, даже попытался passReqToCallback: true на localStrategy, но тоже не удалось

1 Ответ

0 голосов
/ 07 апреля 2020

Вы должны добавить свою стратегию аутентификации как middleware к вашему маршруту входа в систему:

router.post(
  '/users/login',
  passport.authenticate('local', {
    successRedirect: '/',
    failureRedirect: '/users/login',
    failureFlash: 'Invalid username or password.'
  }),
  async (req, res) => {
    // now, you don't need to query the database for your user
    // it should be available on the request already:
    var idUser = req.user.id;
  }
);

Вы также должны переместить лог c, который проверяет, забанен ли пользователь на ваша локальная стратегия.


Редактировать: Вот обновленная локальная стратегия, которая включает в себя все ваши логи c для проверки, если пользователь имеет конфигурацию и не заблокирован.

Редактировать 2:


router.post(
    '/users/login',
    passport.authenticate('local', {
        successRedirect: '/',
        failureRedirect: '/users/login',
    }),
    async (req, res) => {
        if (!req.user.configuration) {
            //const id = consultaUsuario._id;
            req.logOut(req.user);
            const id = req.user._id;
            req.user = null;

            res.redirect('/users/verify?=' + id);
        } else {
            res.redirect('/');
        }
    }
);

passport.use(
    new LocalStrategy(
        {
            usernameField: 'username',
            passwordField: 'password',
        },
        async (username, password, done) => {
            const user = await User.findOne({ username: username });

            if (!user) {
                return done(null, false, {
                    message: 'Este usuario no existe.',
                });
            }

            const match = await user.matchPassword(password);

            if (!match) {
                return done(null, false, {
                    message: 'Usuario/Contraseña no correctos.',
                });
            }

            const configuracion = await Config.findOne({
                idUsuario: user._id,
            });

            if (!configuracion) {
                user.configuration = false;
            } else {
                const delStatus = configuracion.deleteStatus;
                const banStatus = configuracion.banStatus;

                user.configuration = true;

                if (banStatus) {
                    done(null, false, {
                        message:
                            'Su usuario se encuentra bloqueado de nuestra aplicación, contacte con soporte para más información',
                    });
                } else if (delStatus) {
                    done(null, false, {
                        message:
                            'Este usuario está dado de baja de nuestra plataforma, en caso de error contacte con soporte',
                    });
                }
            }

            done(null, user);
        }
    )
);


...