@sawuer

Как правильно придумать свой велосипед для токенов?

Есть задача реализовать выдачу токена при аутентификации.
Серверная сторона - связка NodeJs и PostgreSQL.
Есть таблица юзеров, в которой есть аттрибуты token и token_life_time.

В данный момент, когда клиент аутентифицируется в системе, он получает токен(этот же токен кладется в базу в поле token данного юзера), и в token_life_time кладется new Date() + 24 часа.
Теперь этот юзер обращается к REST ресурсам с заголовком Authorization: Bearer <сюда кладется наш токен>. Токен из себя представляет просто 90-значную строку произвольных символов. При обращение к ресурсу проверятся жизнь токена(token_life_time). Если текущее время меньше token_life_time, то токен еще актуален и юзер имеет доступ к ресурсам, иначе - нет.
Так вот, это все успешно отрабатывает и все довольны.

Вопрос в следующем.
Сейчас есть проблема с использованием рандомайзера для токена(90 произвольных символов), который никак не защищен криптографически. Более того, хочется не генерить произвольные символы, положить в токен нечто важное, например емеил и саму дату истечения срока жизни токена. Хэширование собираюсь реализовать через bcrypt. Bcrypt умеет делать сверку, однако я не смогу получить из хэша дату истечения срока. Однако, она нужна, так как нужно проверять актуальность токена.
Как быть?
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Codebaker
Всё умею, всё могу!
Как минимум: вы должны сверять не просто токен, а сопоставлять токен и сессию пользователя. Иначе ваш велосипед будет уязвим ко всем типам MiTM-атак. Судя по тексту уязвим будет каждые 24 часа - достаточно дождаться авторизации пользователя и после этого можно передать токен атакующему скрипту.
Ответ написан
Комментировать
Мне кажется из того что вы описали лучше всего подойдет вариант с jwt (https://jwt.io/)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы