完成功能如何在护照 js 中工作?

How done function works in passport js?

我有auth功能,我想让它验证我的用户路由。

// auth.js

function auth(request, response, next) {
    passport.authenticate('jwt', { session: false }, async (error, token) => {
        if (error || !token) {
            response.status(401).json({ message: 'Unauthorized' });
        } 
        next(token);
    })(request, response, next);
    next()
}

module.exports = auth;

这是我的 jwt 策略

// passport.js

passport.use(
  new JwtStrategy(opts, (payload, done) => {
    console.log('payload', payload)  // this works
    User.findById(payload.id)
      .then(user => {
        if (user) {
          console.log('here user', user) // this also works
          return done(null, user);
        }

        return done(null, false);
      })
  })
);

但是为什么当我控制台记录我的请求时它没有显示我已经在 done(null, user)

中声明的用户
const auth = require('../auth.js')

router.get('/', auth, async (req, res) => {
   console.log(req.user) // return undefined
   // other code
});

我可以看到几个问题:

  • 从您的 auth() 中间件函数,您在 passport 有机会验证传入请求之前调用 next() - 这是异步发生的。您应该在那里删除对 next() 的同步调用,并推迟到 passport.authenticate() 回调来处理这个问题。
  • passport.authenticate() 回调中,您使用参数调用 next() - express 会将此视为错误发生并跳转到行中的下一个错误中间件。

编辑:我还检查了 passport.authenticate() 回调的签名,它似乎是 (error, user, info) - 而不是 (error, token).

编辑 2:似乎在传递 passport.authenticate() 自定义回调时,您有责任通过调用护照 req.login()req 对象上公开 user功能。请看这里: