Jwt黑名单令牌

时间:2018-08-29 15:34:50

标签: node.js express authentication jwt

我正在使用JWT创建身份验证,除黑名单外,所有内容均已设置。我一直在试图找出一种合适的方法来做,但是我迷路了。以下是我目前的护照代码。对于如何做到这一点,我有一些想法,似乎没有一个是最佳的。因此,如果有人知道是否存在标准的黑名单方式,我将非常感谢您的帮助。

1)我使用每个JWT都具有的“ jit”并将其注销时保存到db中。创建令牌时,我找不到任何将jit添加到令牌有效负载的方法,因此无法使用它。

2)我为令牌创建自己的ID,并将其放入有效负载中。由于它不是最佳方法,因此是一种不得已的方法。

存储标识符的注销功能:

function logout() {
  return tryCatcher(function(req, res, next) {
    if (req.cookies.jwt) {
      var newEntry = {
        token: req.cookies.jwt
      }
      res.clearCookie("jwt");
      models.blacklist.create(newEntry);
      res.status(201).json({message: 'the logout was successfull'});
    }
  });
}

passportStrategy:

const is_jwt_blacklisted = function(token) {
  models.blacklist
    .findOne({where: {token: token}})
    .then(function(blacklistToken) {
      if (blacklistToken) {
        return false; 
      } else {
        return true; 
      }
    });
}

const cookieExtractor = function(req) {
  let token = null;
  if (req && req.cookies)
    {
      token = req.cookies['jwt'];
    }
    return token;
};

passport.use(new JwtStrategy({
  jwtFromRequest: cookieExtractor,
  secretOrKey: config.keys.secret
}, async(payload, done) => {
  try {    
    models.user.findById(payload.userId)
    .then(function(user) {
        if (!user) {
          return done(null, false);
        }
        done(null, user);
     })
  } catch (error) {
    done(error, false)
  }
}));

0 个答案:

没有答案