路线可用或不带令牌JWT + PASSPORT

Igo*_*ins 8 node.js express jwt passport.js

我想我可以使用或不使用令牌访问路由器.如果用户有令牌,请给我req.user

像这样:

router.get('/profile', function(req, res) {
if(req.user) { // or if (req.isAuthenticated())
 res.send('logged')
} else {
 res.send('not loggedIn')
}
});
Run Code Online (Sandbox Code Playgroud)

我的应用:

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
    }
});
}));
Run Code Online (Sandbox Code Playgroud)

如果我尝试访问/profile没有令牌,工作正常.但是,当尝试使用/profile标题中的标记访问时,会给我not loggedIn

即使没有令牌我也想访问它,如果我提供了一个toke,请给我用户.

ps:已经passport.authenticate('jwt')在路线和工作中使用过.如果我给令人让我访问,如果不给我未经授权.

Ade*_*eer 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);
  })
}
Run Code Online (Sandbox Code Playgroud)