如何使用jwt的护照

时间:2016-02-01 13:31:43

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

我尝试使用express,mongoose和jsonwebtoken的护照,但在致电/ api时没有得到回应。请说出我错过的内容。

index.js:

获得护照和本地策略依赖关系:

var passport = require("passport"),
    LocalStrategy = require("passport-local").Strategy;

配置护照:

app.use(passport.initialize());
passport.use(new LocalStrategy({
  usernameField: "email"
},
  function (username, password, done) {
    User.findOne({email: username}, function (err, user) {
      if (err) return done(err);
      if (!user) {
        return done(null, false, {message: "User doesnt exist"});
      }
      if (!user.comparePassword(password)) {
        return done(null, false, {message: "Wrong password!"});
      }
      return done(null, user);
    });
  })
);

和路线:

app.use("/api/login", require("./controllers/login"));

./controllers/login.js

function loginHandler(req, res, next) {
  passport.authenticate("local", function(err, user, info) {
    if (err) return next(err);
    ...
    var token = jwt.sign({name: user.email}, req.app.get("superSecret"),{expiresIn: 60000});    
    return res.json({token: token});
  });
}

1 个答案:

答案 0 :(得分:1)

所以这已经相当晚了,但我只花了两天时间来解决这个问题。问题非常简单,并不是很明显:

function loginHandler(req, res, next) {
  passport.authenticate("local", function(err, user, info) {
    if (err) return next(err);
    ...
    var token = jwt.sign({name: user.email}, req.app.get("superSecret"),{expiresIn: 60000});    
    return res.json({token: token});
  })(req, res, next);
}

请注意,护照呼叫结束时添加了(req, res, next)。这是必要的。如果没有这个,authenticate函数将无法运行。