Истечение срока действия токена Passport-jwt

#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 не имеют состояния и не должны храниться в базе данных