Как использовать утверждение jti в JWT

в спецификации JWT упоминается утверждение jti, которое якобы может использоваться как nonce для предотвращения атак воспроизведения:

утверждение JTI (JWT ID) предоставляет уникальный идентификатор для JWT. Значение идентификатора должно быть назначено таким образом, чтобы была ничтожно малая вероятность того, что одно и то же значение будет случайно назначено другому объекту данных; если приложение использует несколько эмитентов, необходимо предотвратить коллизии между значениями, полученными разными эмитентов, а также. Утверждение jti может использоваться для предотвращения воспроизведения JWT. Значение jti является строкой с учетом регистра. Использование этого утверждения является необязательным.

мой вопрос в том, как я могу это реализовать? Нужно ли хранить ранее использованные jtis и выдавать новый JWT с каждым запросом? Если да, то не противоречит ли это цели JWTs? Зачем использовать JWT вместо того, чтобы просто хранить случайно сгенерированный идентификатор сеанса в базе данных?

мой REST API имеет mongo база данных, и я не против добавления экземпляра redis. Есть ли лучший вариант аутентификации, чем JWT? Я в основном просто не хочу хранить пароли на клиенте, который исключает аутентификацию HTTP в качестве опции, однако, поскольку я углубляюсь в этот материал JWT, я начинаю чувствовать, что пользовательская реализация токена или другой стандарт могут лучше соответствовать моим потребностям. Существуют ли какие-либо пакеты node/express для проверки подлинности на основе маркеров, которые поддерживают отзыв и поворот маркеров жетоны?

был бы признателен за любой совет.

2 ответов


действительно, хранение всех выданных идентификаторов JWT подрывает апатридный характер использования JWTs. Однако целью идентификаторов JWT является возможность отзыва ранее выпущенных Jwts. Этого легче всего добиться путем включения в черный список вместо белого. Если вы включили требование "exp" (вы должны), то вы можете в конечном итоге очистить черный список JWTs, поскольку они истекают естественным образом. Конечно, вы можете реализовать другие варианты отзыва (например, отозвать все токены одного клиента на основе комбинации "iat" и "aud").


вы можете использовать пакет express-jwt

см. express-JWT on GitHub или NPM.

Express-JWT ручки отменено маркеры как описано здесь: https://github.com/auth0/express-jwt#revoked-tokens

var jwt = require('express-jwt');
var data = require('./data');
var utilities = require('./utilities');

var isRevokedCallback = function(req, payload, done){
  var issuer = payload.iss;
  var tokenId = payload.jti;

  data.getRevokedToken(issuer, tokenId, function(err, token){
    if (err) { return done(err); }
    return done(null, !!token);
  });
};

app.get('/protected',
  jwt({secret: shhhhhhared-secret,
    isRevoked: isRevokedCallback}),
  function(req, res) {
    if (!req.user.admin) return res.send(401);
    res.send(200);
  });

вы также можете прочитать Часть 4. как нам избежать добавления накладных расходов? С это сообщение в блоге oauth0.