Подтвердить что ты не робот

Как я могу отменить токен JWT?

Я использую токены Spring Security OAuth2 и JWT. У меня вопрос: как я могу отозвать токен JWT?

Как уже упоминалось здесь http://projects.spring.io/spring-security-oauth/docs/oauth2.html, аннулирование производится токеном обновления. Но это не похоже на работу.

4b9b3361

Ответ 1

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

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

JWT (Learn JSON Web Tokens) просто задает формат токена, эта проблема отзыва также будет применяться к любому формату, который используется в так называемом автономном токене или токене по значению. Мне нравится последняя терминология, потому что она хорошо контрастирует с токенами по ссылке.

токен по значению - связанная информация, включая время жизни токена, содержится в самом токене, и информация может быть проверена как исходящая из доверенного источника (цифровые подписи для спасения)

токен по ссылке - связанная информация хранится в серверном хранилище, которое затем получается с использованием значения токена в качестве ключа; Будучи хранилищем на стороне сервера, соответствующая информация неявно доверяется

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

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

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

В качестве последнего замечания и для того, чтобы сосредоточить это на OAuth 2.0, отзыв токенов доступа по значению в настоящее время не стандартизирован. Тем не менее в отзыве OAuth 2.0 Token определенно указывается, что его все еще можно достичь, если и сервер авторизации, и сервер ресурсов согласуются с пользовательским способом обработки этого:

В первом случае (автономные токены) может использоваться некоторое (в настоящее время нестандартизированное) внутреннее взаимодействие между сервером авторизации и сервером ресурсов, когда требуется немедленный отзыв токена доступа.

Если вы управляете как сервером авторизации, так и сервером ресурсов, это очень легко сделать. С другой стороны, если вы делегируете роль сервера авторизации облачному провайдеру, такому как Auth0, или стороннему компоненту, например, Spring OAuth 2.0, вам, скорее всего, придется по-другому подходить, поскольку вы, вероятно, получите только то, что уже стандартизировано.

Интересная ссылка

В этой статье описывается еще один способ сделать это: черный список JWT. Он содержит некоторые интересные правила и шаблон, за которым следует RFC7523.

Ответ 2

JWT не может быть отозван.

Но здесь есть альтернативное решение, называемое JWT old для новой схемы обмена.

Поскольку мы не можем сделать недействительным выданный токен до истечения срока его действия, мы всегда используем краткосрочный токен, например 30 минут. Когда токен истек, мы используем старый токен для обмена новым токеном. Критическим моментом является то, что один старый токен может заменить один новый токен только only.

На центральном сервере аутентификации мы поддерживаем такую таблицу:

table auth_tokens(
    user_id,
    jwt_hash,
    expire
)

user_id содержится в строке JWT. jwt_hash - это значение хеш-функции всей строки JWT, например SHA256. поле expire необязательно.

Ниже приведен рабочий процесс:

  1. Пользователь запрашивает API входа с именем пользователя и паролем, сервер авторизации выдает один токен и регистрирует токен (добавьте одну строку в таблицу).
  2. Когда токен истек, пользователь запрашивает API обмена со старым токеном. Сначала сервер аутентификации проверяет старый токен как обычный, за исключением проверки срока действия, затем создает значение хэша токена, а затем просматривает таблицу выше по идентификатору пользователя:
    • Если найденные записи и user_id и jwt_hash совпадают, то выдайте новый токен и обновите таблицу.
    • Если найдена запись, но user_id и jwt_hash не совпадают, это означает, что кто-то ранее использовал токен, обмененный новым токеном. Чтобы токен был взломан, удалите записи по user_id и ответьте с информацией о предупреждении.
    • если запись не найдена, пользователю необходимо снова войти в систему или ввести только пароль.
  3. при использовании смените пароль или выйдите из системы, удалите запись по идентификатору пользователя.

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

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

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

источник: http://www.jianshu.com/p/b11accc40ba7

Ответ 3

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

https://www.dinochiesa.net/?p=1388

Ответ 4

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

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

Эта статья " Отзыв JWT" иллюстрирует эту концепцию и содержит пример приложения на Github.

Ответ 5

Я нашел один способ решения проблемы: Как истечь уже сгенерированный существующий токен JWT с помощью Java?

В этом случае нам нужно использовать любую БД или оперативную память, где

Шаг 1: Как только токен будет впервые сгенерирован для пользователя, сохраните его в БД с токеном и временем.DidAt().

Я сохранил его в БД в этом формате JSON,

Пример: {"username" : "username", "token" : "token", "issuedAt" : "issuedAt"}

Шаг 2: Как только вы получите запрос веб-службы для того же пользователя с токеном для проверки, извлеките метку времени "ardedAt()" из токена и сравните ее с сохраненной (БД/в памяти) ) выдана временная метка.

Шаг 3: Если сохраненная выданная временная метка является новой (с использованием метода after()/before()), верните, что токен недействителен (в этом случае мы фактически не истекаем токена, но мы прекратим предоставлять доступ к этому токену).

Вот так я решил проблему.

Ответ 6

Ниже приведены инструкции по отзыву вашего токена доступа JWT:

  1. При входе в систему отправьте 2 токена (токен доступа, токен обновления) в ответ клиенту.
  2. У маркера доступа будет меньше время истечения, а у обновления будет долгое время истечения.
  3. Клиент (Front end) будет хранить токен обновления в своем локальном хранилище, а токен доступа - в куки.
  4. Клиент будет использовать токен доступа для вызова API. Но когда он истекает, выберите токен обновления из локального хранилища и вызовите сервер аутентификации api, чтобы получить новый токен.
  5. Ваш сервер аутентификации будет иметь доступ к API, который примет токен обновления, проверит его действительность и вернет новый токен доступа.
  6. Когда срок действия маркера обновления истечет, пользователь выйдет из системы.

Пожалуйста, дайте мне знать, если вам нужно больше деталей, я также могу поделиться кодом.