#node.js #express #passport.js #jwt
#node.js #экспресс #passport.js #jwt
Вопрос:
Я использую passport-jwt для генерации своих токенов, но я заметил, что срок действия токенов никогда не истекает, есть ли какой-либо способ аннулировать конкретный токен в соответствии с установленным для меня правилом, что-то вроде:
'use strict';
const passport = require('passport');
const passportJWT = require('passport-jwt');
const ExtractJwt = passportJWT.ExtractJwt;
const Strategy = passportJWT.Strategy;
const jwt = require('../jwt');
const cfg = jwt.authSecret();
const params = {
secretOrKey: cfg.jwtSecret,
jwtFromRequest: ExtractJwt.fromAuthHeader()
};
module.exports = () => {
const strategy = new Strategy(params, (payload, done) => {
//TODO: Create a custom validate strategy
done(null, payload);
});
passport.use(strategy);
return {
initialize: function() {
return passport.initialize();
},
authenticate: function() {
//TODO: Check if the token is in the expired list
return passport.authenticate('jwt', cfg.jwtSession);
}
};
};
или какая-либо стратегия для аннулирования некоторых токенов
Комментарии:
1. Не могли бы вы решить это?
Ответ №1:
Стандартом для JWT является включение срока действия в полезную нагрузку как «exp». Если вы это сделаете, модуль passport-JWT будет уважать это, если вы явно не скажете ему не делать этого. Проще, чем реализовать это самостоятельно.
Редактировать
Теперь с большим количеством кода!
Обычно я использую модуль npm jsonwebtoken
для фактического создания / подписания своих токенов, в котором есть опция для установки срока действия с использованием удобных временных смещений в элементе exp полезной нагрузки. Это работает следующим образом:
const jwt = require('jsonwebtoken');
// in your login route
router.post('/login', (req, res) => {
// do whatever you do to handle authentication, then issue the token:
const token = jwt.sign(req.user, 's00perS3kritCode', { expiresIn: '30m' });
res.send({ token });
});
Затем ваша стратегия JWT может выглядеть так, как у вас уже есть, исходя из того, что я вижу, и она будет автоматически соблюдать время истечения в 30 минут, которое я установил выше (очевидно, вы можете установить другие сроки).
Комментарии:
1. Каковы наилучшие методы продления срока службы токена? Например, если пользователь хочет провести в приложении более 30 минут?
2. Это делается с помощью того, что обычно называют «токеном обновления», что в основном означает, что вы запрашиваете новый токен авторизации для определенной конечной точки. Клиентское приложение, как правило, должно проявлять инициативу в этом отношении. Более подробная информация: auth0.com/blog /…
3. Я добавил
expiresIn: '10s'
, но не работает. Токен работает через 10 секунд.4. @iamcrypticcoder то же самое, токен никогда не истекает
Ответ №2:
Вы можете использовать следующую стратегию для генерации JWT-токена с ограничением срока действия в 1 час.
let token = jwt.sign({
exp: Math.floor(Date.now() / 1000) (60 * 60),
data: JSON.stringify(user_object)
}, 'secret_key');
res.send({token : 'JWT ' token})
Ответ №3:
Я создал документ в базе данных, в котором хранятся сгенерированные токены, и добавил дату истечения срока действия, когда пользователь проверяет запрос, истек срок действия токена или нет.
Это стратегия проверки, которую я использовал.
/* ----------------------------- Create a new Strategy -------------------------*/
const strategy = new Strategy(params, (payload, done) => {
const query = {
token: jwtSimple.encode(payload, credentials.jwtSecret),
expires: {$gt: new Date()}
};
TokenSchema.findOne(query, (err, result) => {
if (err) done(err, null);
if (!result) done(null, null);
done(null, payload);
});
});
passport.use(strategy);
/* -------------------------------------------------------------------------------*/
Это работа для меня.
Комментарии:
1. Если вы все еще делаете это, я бы посоветовал остановиться. Вы упускаете весь смысл JWT, поскольку они должны быть без состояния.
2. Да, точно, здесь плохая практика. Лучшие альтернативы для подхода с учетом состояния.
3. Как указывалось ранее, JWT не имеют состояния и не должны храниться в базе данных