Обновление/изменение роли заявки (или любой другой претензии) в JWT

Я храню роли пользователя внутри JWT (для ограничения конечных точек API). Роли могут быть изменены администратором.

Если роль изменена. Как я должен отражать это во всех жетонах? Я подумал о нескольких решениях:

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

  • Я мог бы вести запись об измененных идентификаторах пользователей и проверять каждый запрос, а затем возвращать новый токен, если пользователь был изменен.

Есть ли стандартный способ сделать это?

Ответ 1

Обновить токены, похоже, не являются решением, если вы беспокоитесь об изменениях, которые вы делаете мгновенно, вы, вероятно, не хотите, чтобы пользователь некоторое время обращался к средствам модерации, если вы отменили его разрешения.

Что вы можете сделать, так это сохранить номер версии в токене jwt относительно пользователя, так же, как он делает это с помощью мангуста versionKey. Делая это, вы сможете проверить эту версию по сравнению с той, что находится в базе данных для данного пользователя. Каждый раз, когда вы меняете роли этого пользователя, вы увеличиваете эту версию, если версия jwt не соответствует, просто создайте новую с правильными ролями и версией и отправьте ее пользователю.

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

Ответ 2

Тоны JWT неизменяемы, поэтому вы не можете изменять/обновлять заявки на существующий токен, поэтому вам нужно выпустить новый токен JWT.

Это приводит к самой большой проблеме с отзывом маркера JWT. Нет хороших решений. Что вы можете сделать, это

  • Удерживайте дату истечения срока действия JWT (и необязательно используйте токены обновления)

  • Используйте черный список, чтобы сохранить список отозванных токенов (конечно, таким образом, потеряв часть "без гражданства" )

  • измените секретный ключ (имейте в виду, что это отменяет ВСЕ действительные токены всех пользователей)

Наилучшее решение зависит от конкретного случая.