我希望我可以使用或不使用令牌访问路由器。如果用户有令牌,请给我req.user
像这样:
router.get('/profile', function(req, res) {
if(req.user) { // or if (req.isAuthenticated())
res.send('logged')
} else {
res.send('not loggedIn')
}
});
我的应用:
var JwtStrategy = require('passport-jwt').Strategy,
ExtractJwt = require('passport-jwt').ExtractJwt;
var opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeader();
opts.secretOrKey = 'sh';
passport.use(new JwtStrategy(opts, function(jwt_payload, done) {
User.findOne({id: jwt_payload.sub}, function(err, user) {
if (err) {
return done(err, false);
}
if (user) {
done(null, user);
} else {
done(null, false);
// or you could create a new account
}
});
}));
如果我尝试在没有令牌的情况下访问/profile
,则可以正常工作。
但是,如果尝试使用标头中的令牌访问/profile
,则会向我提供 not loggedIn
即使没有令牌我也想访问它,如果我提供了一个toke,请给我这个用户。
ps:已在路线中使用passport.authenticate('jwt')
进行测试并正常运行。如果我给令人让我访问,如果没有给我许可。
答案 0 :(得分:2)
按如下方式更改路由器
router.get('/profile', authenticateUser(), profile());
function authenticateUser(req, res, next) {
// your strategy here...
if (authenticated) {
req.user = user;
next();
} else {
return res.status(401).send("Not authenticated");
}
}
function profile(req, res, next) {
var userId = req.user.id;
User.findById(userId, function(err, user) {
if (err) { return res.status(500).json(err); }
return res.json(user);
})
}
答案 1 :(得分:2)
您应该使用以下其中一项来访问请求数据
NULL
或
if (req.params.user) {do something...}
请求对象没有用户属性。
答案 2 :(得分:2)
我正是这样做的:
const passport = require('passport');
const optionalJwt = function (req, res, next) {
if (req.headers['authorization']) {
return passport.authenticate('jwt', { session: false })(req, res, next);
}
return next();
};
app.get('/my/route', optionalJwt, function (req, res, next) {
if (req.isAuthenticated()) {
res.send('My name is ' + req.user.name);
} else {
res.send('I\'m not authenticated :(');
}
});
如果包含auth标头但令牌已过期或无效,它仍然会失败,但它可能会起作用。对我而言,确实如此。