Arhn - архитектура программирования

Токен внутри полезной нагрузки JWT

Является ли хорошей идеей иметь случайно сгенерированный токен внутри полезной нагрузки JWT и проверять его с базой данных по каждому запросу?

Я провел свое исследование JWT и того, как он на самом деле работает, и я знаю, что его основная цель - избежать запроса базы данных при каждом запросе на авторизацию пользователя, но мне все равно нужно это сделать, поскольку мне нужна определенная информация о пользователе, который делает запрос.

Мне также нужно хорошее решение, чтобы немедленно отозвать токен, если мне нужно. Изначально занесение токена в черный список кажется хорошим решением, но для этого потребуются дополнительные запросы, и я не думаю, что оно того стоит.

Итак, решение, которое я придумал, - это сгенерировать случайный токен и сохранить этот токен в моей базе данных, а также поместить его в полезную нагрузку JWT. Таким образом, когда пользователь делает новый запрос, он сначала проверяет, действителен ли токен JWT, а если это так, он затем проверяет, действителен ли токен, связанный с полезной нагрузкой.

Поэтому, если пользователю нужно изменить свой пароль, например, его токен изменится, и все токены JWT с предыдущим токеном в своей полезной нагрузке не смогут пройти проверку.

Итак, решение будет таким:

Когда пользователь регистрируется, ему назначается randomToken, который также сохраняется внутри полезной нагрузки. Если регистрация прошла успешно, сервер возвращает сгенерированный токен jwtToken.

var jwtToken = jwt.sign({token: randomToken}, PRIVATE_KEY, SIGN_OPTIONS);

Поэтому, когда пользователь делает новый запрос, он сначала проверяет, действителен ли токен JWT.

var legit = jwt.verify(token, JWT_PUBLIC_KEY, SIGN_OPTIONS);

Если это так, он переходит к проверке токена внутри полезной нагрузки с токеном пользователя в базе данных.

SELECT * FROM users WHERE token = legit.token

Если все в порядке, выполняется обычный запрос.

14.06.2019

  • Это лишает смысла использование JWT. Вы говорите, что понимаете это, но на самом деле вам не следует использовать JWT, если вам все равно нужно выполнять поиск в базе данных. dzone.com/articles/stop-using-jwts-as-session- токены 14.06.2019
  • @TheGreatContini спасибо за ссылку. То, что он говорит, имеет смысл, но я забыл упомянуть, что намерен использовать его в своих мобильных приложениях, и, как говорится в статье, если вы создаете службы API, которые должны поддерживать межсерверную или клиентскую сервер (например, мобильное приложение или одностраничное приложение (SPA)), использование JWT в качестве токенов API - очень разумная идея. 14.06.2019

Ответы:


1

"Это хорошая идея ..." - не лучший способ задать вопрос, но я постараюсь ответить на него ...

1. JWT безопасен

Причина создания закрытого ключа - убедиться, что пользователь не меняет токен. Следовательно, совершенно безопасно хранить объект, который часто используется в токене, и нет необходимости нигде хранить токен. Подписанный объект будет выглядеть так:

{
  expirationDate: 1560530063664,
  ...user data
}

2. Внесение в черный список и отзыв токенов

Я считаю, что лучший способ занести определенный токен в черный список - это то, что вы придумали. В зависимости от того, сколько пользователей одновременно обращаются к веб-сайту, возможно / будет хорошей идеей просто использовать массив бедра.

Хотя может быть неплохо иметь возможность занести токен в черный список, действительно ли это необходимо? Если пользователь обновляет свой пароль, действительно ли ему нужно выходить из системы? Если вы все еще думаете, что вам нужно хранилище токенов, я считаю, что для этого есть несколько пакетов npm ...

14.06.2019
  • Привет, спасибо за ответ. Я знаю, что JWT довольно безопасен. Но если токен будет украден, он будет действителен до истечения срока его действия. Поэтому, если я не проверяю его с базой данных при каждом запросе, он все равно будет действителен, даже если пользователю был выдан новый токен JWT. 14.06.2019
  • Что ж, хотя это может случиться, скорее всего, этого не произойдет, и пользователь, скорее всего, не заметит этого, пока не истечет срок его действия, если вы не установите дату истечения ›на неделю. 14.06.2019
  • Хотя у вас может быть черный список с токенами, и когда они истекут, вы удалите их из черного списка. Но это будет означать, что вы либо используете базу данных, либо проходите через массив, и в зависимости от того, сколько пользователей сообщили о краже своей учетной записи, это может занять некоторое время ... 14.06.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..