Как использовать токены обновления в аутентификации jwt

У меня есть несколько вопросов о реализации токенов обновления. Я много искал, но ничего не нашел:

  1. Должен ли я использовать jwt для токена обновления или это может быть хешированная строка? Каковы преимущества использования jwt в токенах обновления?

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

  3. Нужно ли мне отправлять клиенту токен обновления? (Поскольку мы храним его в базе данных и удаляем его при выходе из системы)


person Vahid Najafi    schedule 09.04.2019    source источник


Ответы (2)


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

  1. Преимущества: у вас есть тот же механизм проверки, что и для токена доступа (проверка действительности, срок действия и т. Д.).
  2. Обычно токены обновления имеют очень долгий срок действия (намного дольше, чем токен доступа). Не рекомендуется использовать длинные токены доступа, так как вы не можете их отозвать. Иметь долговременные токены обновления - это нормально, если вы можете их отозвать.
  3. Да, вы должны отправить его клиенту, чтобы архитектура оставалась без сохранения состояния (я полагаю, это ваша цель использования JWT)
person Tomasz Białecki    schedule 09.04.2019
comment
Yes you have to send it to client, to keep you architecture stateless: токены обновления должны быть сохранены в базе данных. Таким образом, мы можем обрабатывать функцию выхода из системы. Итак, ваше предложение не имеет смысла. - person Vahid Najafi; 09.04.2019
comment
И поскольку мы должны сохранить токен обновления в базе данных, нам не нужно их проверять, поэтому нам не нужно использовать jwt в токене обновления. Я что-то упускаю? - person Vahid Najafi; 09.04.2019
comment
Вы можете сохранить только одно требование из токена обновления в базе данных, а не весь токен. { iss: "iss value", aud: "aud value", exp: 1553521788, refreshKey: "key stored in db" } - person Tomasz Białecki; 09.04.2019
comment
У меня вопрос именно здесь, почему мы не отправляем пользователю просто refreshKey? Зачем нам его проверять (как jwt)? Мы можем сохранить refreshKey в базе данных, отправить ее пользователю и удалить из базы данных, когда пользователь захочет выйти из системы. - person Vahid Najafi; 09.04.2019
comment
Я думаю, единственная причина в том, что когда мы хотим выйти из системы, мы можем определить, какой токен обновления необходимо удалить из базы данных. (Потому что пользователь может войти в систему с нескольких устройств и выйти из каждого из них, когда захочет) - person Vahid Najafi; 09.04.2019
comment
Думаю, ваш подход тоже хорош. Единственная проблема - это действительность этого токена обновления. Если вы собираетесь управлять им, вам необходимо дополнительно сохранить срок годности в db. - person Tomasz Białecki; 09.04.2019
comment
Почему мы должны устанавливать дату истечения срока действия Refresh Token? Что делать, если срок его действия истекает? (Мы хотим, чтобы пользователь всегда был авторизован, когда он проверяет, запомнил меня) - person Vahid Najafi; 09.04.2019
comment
Извините, возможно, я слишком заперт :) Я использовал подход, согласно которому, если пользователь не использует приложение в течение месяца, он выходит из системы. Но если вы не хотите, чтобы он оставался в системе вечно, вам не нужны истекающие токены обновления. - person Tomasz Białecki; 10.04.2019
comment
Спасибо, и, наконец, мне больше не нужно делать мой ключ обновления jwt. Я прав? - person Vahid Najafi; 10.04.2019
comment
Спасибо за поддержку. Если вы хотите отредактировать свой ответ в соответствии с нашим обсуждением, я бы принял его как верный ответ. Кстати, спасибо. - person Vahid Najafi; 10.04.2019

  1. Токен обновления должен использоваться клиентом для получения нового токена доступа с сервера. Таким образом, формат токена обновления полностью зависит от сервера авторизации, который выдает токен. Если вы выдаете «токен доступа» и «токен обновления», тогда проще иметь один и тот же формат, то есть формат JWT.
  2. У токенов обновления должен быть срок действия. Это может быть намного дольше, чем срок действия обычного токена доступа. Ресурс всегда может сделать его настраиваемым.
  3. Вы должны отправить токен обновления клиенту, чтобы клиент мог использовать его для запроса нового токена.
person psg85    schedule 13.04.2019