护照
passport.use('jwt', new JwtStrategy(opts, function(jwt_payload, done) {
User.where({id: jwt_payload.id}).fetch().then(function(user) {
if(user) {
return done(null, user);
} else {
return done(null, false);
}
}).catch(function(err) {
return done(err, false);
});
}));
示例2
这有效,但是当未设置JWT时,我认为我应该收到res = null
响应时会收到401
。
app.get('/user', getProfile);
getProfile = function(req, res, next) {
passport.authenticate('jwt', {session: false}, function(err, user, info) {
if(user) {
res.json(user);
} else {
res.json(err);
}
})(res, req, next);
};
示例2
如果没有设置JWT,那么我会得到正确的401
响应,但如果设置了,我将无法返回user
,因为res
不存在。
app.get('/user', passport.authenticate('jwt', {session: false}, getProfile);
getProfile = function(err, user) {
if(user) {
res.json(user);
} else {
res.json(err);
}
};
那么如何将res传递给这个函数呢?
答案 0 :(得分:1)
在您的第一个示例中,您似乎只是在函数调用中混淆了req
和res
的顺序。它应该是
})(req, res, next);
不
})(res, req, next);
在您的第二个示例中,我认为您正在使用passport.authenticate
回调错误。
passport.authenticate
方法只是在实际路由被击中之前调用的中间件。它的回调不会取代您为处理发送响应而定义的常规路由回调函数 - 您仍然需要在中间件之后提供路由回调。
app.get('/user',
passport.authenticate('jwt', { session: false }),
function(req, res, next) {
res.json(req.user);
});
如果用户未经过身份验证,authenticate
方法应该使用适当的状态代码进行响应,这样您就可以安全地在路由回调中调用req.user
并知道用户已通过身份验证。