Как использовать утверждение 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.