有或没有令牌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头文件但令牌已过期或无效,它仍然会失败,但它可能是有用的。 对我来说呢。
- 如何利用Heroku的“postdeploy”脚本在预置的Heroku PostgreSQL数据库中创build表?
- connect-mongo创build的条目不会过期
- 使用Node.js ENOTFOUNDparsingSDK JavaScript
- 无法在React服务器端呈现中处理UnhandledPromiseRejectionWarning
- NodeJS – 快速重载res.render()后面的页面
- 如何使用Node-Express统计CSV文件的行数
- .ejs与.html相比?
- Node / React应用程序不会部署到Heroku
- 将Express NodeJS的值传递给AngularJS控制器variables