Я создаю аутентификацию с JWT, и все настроено, кроме черного списка. Я пытался найти правильный способ сделать это, но я потерян. Вот как выглядит мой паспортный код на данный момент. У меня есть пара идей о том, как это сделать, но ни один из них не является оптимальным. Поэтому, если кто-нибудь знает, существует ли стандартный способ внесения в черный список, я был бы очень признателен за помощь.
1) Я использую «jit», который есть у каждого JWT, и сохраняет его в БД при выходе из системы. Я не могу найти способ добавить jit в полезную нагрузку токенов при создании токена, и поэтому не могу его использовать.
2) Я создаю свой собственный идентификатор для токена и помещаю его в полезную нагрузку. Это своего рода метод последней инстанции, поскольку он не оптимален.
Функция выхода из системы, где хранится идентификатор:
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)
}
}));