首页 > 解决方案 > 护照身份验证 - LocalStrategy 永远不会被调用

问题描述

我正在尝试使用 LocalStrategy 对 Passor 进行身份验证。问题是这个策略似乎永远不会被调用,如果我在我的 passport.authenticate 中记录用户对象,它会返回“false”。

这是我的代码客户端:

  logIn = () => {
    const username = this.state.mail;
    const password = this.state.password;
    console.log("stringify " + JSON.stringify({username, password}));
    fetch('http://localhost:3001/api/logIn',
    {
      method: 'POST',
      headers:  {'Content-Type': 'application/json'
    /*'Access-Control-Allow-Origin': '*'*/},
      body: JSON.stringify({username, password})
    }).then(res => res.json()).then((res) => {
      if (!res.success) console.log("fallito");
      else console.log(res.username);
    });
  }

这是策略:

passport.use(new LocalStrategy(
  { usernameField: "mail" },
  (username, password, done) => {
    console.log("Inside localStrategy");
  User.findOne({ mail: username.toLowerCase() }, (err, user) => {
     if (err) {
       console.log("not found " + err);
       return done(err); }
     if (!user) {
       console.log("not users")
       return done(undefined, false, { message: `Email ${mail} not found.` });
     }
     user.comparePassword(password, (err, isMatch) => {
       if (err) {
         console.log("password not correct " + err);
         return done(err); }
       if (isMatch) {
         console.log("match");
         return done(undefined, user);
       }
       console.log("invalid password")
       return done(undefined, false, { message: "Invalid email or password." });
      });
    });
}));

这里调用passport.authenticate:

router.post('/logIn', (req, res, next) =>{
  console.log('Inside Login post ' + req);

  const user = new User();
  const {username, password} = req.body;
  user.mail = username;
  user.password = password;

  passport.authenticate('local', (err, user, info) => {
    console.log('Inside Login authenticate ' + user.mail);
    if (err) { return next(err); }
   if (!user) { return res.redirect('/'); }

   // req / res held in closure
   req.logIn(user, function(err) {
     console.log('Inside Login login ' + user);
     if (err) { return next(err); }
     return res.json({
       success: true,
       username: req.user.name
     });
   });

 })(user, res, next);
 /*
  console.log("in authentication: " + req);
  return res.json({
    success: true,
    username: req.user.name
  });
  }
)(req,res,next);*/
});

请注意,我一直在尝试传递一个 User 对象,就像上面的代码一样,并直接传递 req var。

标签: javascriptreactjsexpressauthenticationpassport.js

解决方案


在登录路由中,您正在local使用 passport.authenticate 调用策略,但您尚未创建local策略。

请试试

passport.use('local', new LocalStrategy(

代替

passport.use(new LocalStrategy(


推荐阅读