我正在使用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)
}
}));