可使用或不使用令牌 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 正确检查令牌有效负载?

如何使用passport-jwt在nodejs中发送/提取JWT令牌?

Passport-jwt 不同的令牌相同的结果

NodeJs Express passport-jwt 从令牌中获取错误的用户

REST API 没有根据标头中的 Passport JWT 令牌更改用户?

NestJS & Passport:更改用户密码时更改 JWT 令牌?