【问题标题】:Strategy not being used, why?策略没有被使用,为什么?
【发布时间】:2016-06-14 22:40:33
【问题描述】:

我是 express 的新手,我正在尝试使用护照实现一些身份验证方法。这对我来说似乎是最好的选择,我开始阅读几个教程,现在我有了这个不寻常的代码。 显然策略 registerStrategy 没有被使用,因为 console.log("log"); 没有显示在服务器的控制台中。 节点不会抛出错误。

//localStrategy.js

var registerStrategy = new localStrategy(
  function(req, res, done){
    console.log("log");
    var user = {
      username: req.user.username,
      password: req.user.password,
      name: req.body.user.name,
      lastname: req.body.user.lastname,
      email: req.body.user.email,
      event_time: req.body.user.event_time
    };
    var usernameExists = true, emailExists = true;
    var tasks = [
      function(cb){
        db.usernameExists(user.username, function(err, exists){
          if(err) return cb(err);
          usernameExists = exists;
          cb();
        });
      },
      function(cb){
        db.emailExists(user.email, function(err, exists){
          if(err) return cb(err);
          emailExists = exists;
          cb();
        });
      }
    ];
    async.parallel(tasks, function(err){
      if(err) return done(err);
      if(usernameExists || emailExists){
        return done(null, usernameExists, emailExists);
      }
      done(null, null, null);
    });

  }
);
	
	app.use(session(sessionData));
	passport.use("local-register", registerStrategy);

//routes.js

app.post("/api/register", function(req, res){
  passport.authenticate("local-register")(req, res, 
                                          function(err, usernameExists, emailExists){
    if(err) throw err;
    if(usernameExists){
      return res.status(401).json({ err: "User exists"});
    }
    else if(emailExists){
      return res.status(401).json({ err: "Email exists"});
    }
    res.status(200).json({status: "Succesful"});
  }
  );
});

我的错误在哪里?

【问题讨论】:

  • 你检查过控制台错误吗?是说 localStrategy undefined 吗?是否已导入所需文件。
  • 是的,我已经检查过了,没有错误。我导入了所有需要的文件或库。你熟悉我所说的策略吗?与 ("local-register")(...) ?认为这可能是问题

标签: node.js passport.js passport-local


【解决方案1】:

passport.authenticate(...) 是一个返回middleware 函数的函数,所以第三个参数是对下一个middleware 函数的引用。在您的代码中,匿名函数:

function(err, usernameExists, emailExists){
    if(err) throw err;
    if(usernameExists){
      return res.status(401).json({ err: "User exists"});
    }
    else if(emailExists){
      return res.status(401).json({ err: "Email exists"});
    }
    res.status(200).json({status: "Succesful"});
})

应该在passport.authenticate 函数中作为callback。像这样的:

app.post("/api/register", function(req, res){
  passport.authenticate("local-register", function(err, usernameExists, emailExists){
    if(err) throw err;
    if(usernameExists){
      return res.status(401).json({ err: "User exists"});
    }
    else if(emailExists){
      return res.status(401).json({ err: "Email exists"});
    }
    res.status(200).json({status: "Succesful"});
  })(req, res);
});

还要注意,匿名函数的第二个参数应该是应用程序在有机会验证凭据后提供的对象(用户对象),第三个参数是有关用户的附加信息。关于LocalStrategy中的代码,为了在参数中传递req对象,你需要指定选项{passReqToCallback : true},之后你将在函数callback中有四个参数,它们是:requsernamepassword 和另一个 callback 函数,通常命名为 done,所以签名应该是这样的:

var registerStrategy = new localStrategy(
    {passReqToCallback : true},
    function(req, username, password, done){
        ...
    } 

【讨论】:

    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多