Passport.authenticate没有发送响应

时间:2017-01-16 08:13:13

标签: passport.js

我正在使用Passport进行身份验证,特别是使用JWT策略。我可以在创建用户时创建新令牌,但是,当我在请求标头中使用该令牌到需要身份验证的路由时,我的请求就会挂断。我正在使用Postman来测试这些POST / GET请求。

以下是我注册用户的初始配置:

const User = require('../db/models/User');
const jwt = require('jsonwebtoken');

function userToken(user) {
  return jwt.sign({
    id: user.id,
  }, process.env.JWT_SECRET);
}

exports.signup = function(req, res, next) {
  const email = req.body.email.toLowerCase();
  const password = req.body.password.toLowerCase();

  User.findOne({
    where: { email },
  }).then(function(user) {
    if (!user) {
      User.create({
        email,
        password,
      })
      .then(function(user) {
        return res.send({ token: userToken(user) });
      });
    }
    if (user) {
      return res.send({ message: 'That user is in use' });
    }
  });
};

这是我的护照配置:

const passport = require('passport');
const JwtStrategy = require('passport-jwt').Strategy;
const ExtractJwt = require('passport-jwt').ExtractJwt;
const User = require('../db/models/User');

const jwtOptions = {
  jwtFromRequest: ExtractJwt.fromHeader('authorization'),
  secretOrKey: process.env.JWT_SECRET,
};

const jwtLogin = new JwtStrategy(jwtOptions, function(payload, done) {
  User.findOne({
    where: { id: payload.id },
  }, function(err, user) {
    if (err) { return done(err, false); }
    if (user) { return done(null, user); }
    return done(null, false);
  });
});

passport.use(jwtLogin);

以下是我的受保护路线:

const passport = require('passport');

const requireAuth = passport.authenticate('jwt', { session: false });

module.exports = function router(app) {
  app.get('/', requireAuth, function(req, res) {
    res.send({ 'hi': 'there' });
  });
};

以下是我在终端中看到的内容:

Executing (default): SELECT "id", "username", "email", "password", "photo", "createdAt", "updatedAt" FROM "users" AS "user" WHERE "user"."id" = 15;

所以我知道它正确地查询用户ID并搜索它,但是,它只是暂停,而不是为我提供响应。

不确定问题是什么,所以欢迎和赞赏任何和所有建议。谢谢!

1 个答案:

答案 0 :(得分:1)

意识到因为我正在使用Sequelize,它会像这样处理错误来处理错误:

...

const jwtLogin = new JwtStrategy(jwtOptions, function(payload, done) {
  User.findOne({
    where: { id: payload.id }
  })
  .then(user => {
    if (user) {
      done(null, user);
    } else {
      done(null, false);
    }
  })
  .catch(err => {
    if (err) { return done(err, false); }
  });
});

...

这解决了我的问题并且正在回复我的回复。