可使用或不使用令牌 JWT+PASSPORT 的路线
Posted
技术标签:
【中文标题】可使用或不使用令牌 JWT+PASSPORT 的路线【英文标题】:Route available with or without token JWT+PASSPORT 【发布时间】:2017-06-04 22:59:17 【问题描述】:我希望我可以访问带有或不带有令牌的路由器。如果用户有令牌,那就给我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
即使没有令牌,我也想访问它,如果我提供了令牌,请给我用户。
ps: 已经在路由中使用passport.authenticate('jwt')
进行了测试,并且可以正常工作。如果我给令牌让我访问,如果不给我未经授权。
【问题讨论】:
【参考方案1】:这就是我的做法:
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 标头但令牌已过期或无效,它仍然会失败,但它可能会达到目的。对我来说确实如此。
【讨论】:
【参考方案2】:您应该使用以下方法之一来访问请求数据
if (req.params.user) do something...
或
if (req.body.user) do something...
请求对象没有用户属性。
【讨论】:
【参考方案3】:如下更改你的路由器
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);
)
【讨论】:
以上是关于可使用或不使用令牌 JWT+PASSPORT 的路线的主要内容,如果未能解决你的问题,请参考以下文章
如何使用passport-jwt在nodejs中发送/提取JWT令牌?
NodeJs Express passport-jwt 从令牌中获取错误的用户