有或没有令牌JWT + PASSPORT的路线可用
我希望我可以使用或不使用令牌来访问路由器。 如果用户有一个令牌,比给我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')
进行了testing并工作。 如果我给令牌让我访问,如果不给我擅自。
改变你的路由器如下
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); }) }
你应该使用下面的一个访问请求数据
if (req.params.user) {do something...}
要么
if (req.body.user) {do something...}
请求对象没有用户属性。
这是我如何做到这一点:
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头文件但令牌已过期或无效,它仍然会失败,但它可能是有用的。 对我来说呢。
- 使用Backbone.js创build一个模态
- 节点 – Passport Auth – Authed Post路由在表单提交时挂起
- 有关如何passport.js工作的问题。 具体关于user.id
- 如何在MongoDB中为NodeJS Express应用程序存储站点configuration?
- 使用Express 4在Node.js中全局处理exception的最佳方法是什么?
- 在本地MongoDB点mongoos.connect
- Express.jsredirect到HTTPS并发送index.html
- 在nodejs中,如何停止FOR循环直到mongodb调用返回
- 使用node.jsexpression式获取和处理来自数据库的数据