完成功能如何在护照 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
功能。请看这里:
我有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
功能。请看这里: