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

时间:2017-01-20 03:10:49

标签: node.js express passport.js jwt

我希望我可以使用或不使用令牌访问路由器。如果用户有令牌,请给我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')进行测试并正常运行。如果我给令人让我访问,如果没有给我许可。

3 个答案:

答案 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标头但令牌已过期或无效,它仍然会失败,但它可能会起作用。对我而言,确实如此。