【问题标题】:Why passport.authenticate is not calling?为什么 passport.authenticate 没有调用?
【发布时间】:2020-07-19 01:23:36
【问题描述】:

这是我的第一个问题,我有点厌倦搜索......也许这是一个新手错误,但我已经尝试了一切来解决它,但没有找到答案。

我已经建立了这样的护照新本地策略:

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 这是最准确的:

本地策略:

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
});

我尝试了很多东西,但是...没有人成功,甚至在 localStrategy 上尝试过passReqToCallback: true,但也没有成功

【问题讨论】:

    标签: javascript node.js asynchronous callback passport.js


    【解决方案1】:

    您需要将身份验证策略作为中间件添加到您的登录路径:

    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;
      }
    );
    

    您还应该将检查用户是否被禁止的逻辑移至您的本地策略。


    编辑:这是一个更新的本地策略,其中包含所有用于检查用户是否具有配置且未被禁止的逻辑。

    编辑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);
            }
        )
    );
    
    
    

    【讨论】:

    • 好吧,它可以工作,但还有最后一步来解决它:如何将参数从我的新本地策略重定向/发送到身份验证功能?我想验证存在但没有配置的用户
    • 我会用不同的本地策略更新我的答案。
    • 不,不能正常工作,即使他们被平台阻止或退订,它也会登录每个用户,我会再检查一遍
    • 我已经做了一些测试,但是......没有好的结果@davidmwhynot 上的 async 函数没有调用 passport.authentication,不能在那里发送任何内容,也看不到 req.params在那里,无论如何它都会登录
    • 还是不能正常工作,最准确的答案是第一个,唯一的问题是无法将用户重定向到验证页面,其余工作正常
    猜你喜欢
    • 1970-01-01
    • 2012-04-06
    • 2012-08-11
    • 2011-10-27
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多