JWT оновить потік токенів


129

Я будую мобільний додаток і використовую JWT для аутентифікації.

Здається, найкращий спосіб зробити це - з’єднати маркер доступу JWT з маркером оновлення, щоб я міг закінчувати термін доступу так часто, як мені хочеться.

  1. Як виглядає маркер оновлення? Це випадковий рядок? Це рядок зашифровано? Це інший JWT?
  2. Маркер оновлення зберігатиметься в базі даних на користувацькій моделі для доступу, правда? Здається, в цьому випадку його слід зашифрувати
  3. Чи надсилаю я маркер оновлення після входу користувача, а потім клієнт має доступ до окремого маршруту, щоб отримати маркер доступу?

3
Зауважте, якщо ви використовуєте маркери оновлення, ви повинні надати можливість користувачам визнати їх недійсними в інтерфейсі користувача. Також рекомендується автоматично термін дії їх, якщо вони не використовуються, наприклад, протягом місяця.
Вільмантас Баранаускас

1
@jtmarmon: як ви зберігаєте маркер оновлення на стороні клієнта? Я маю на увазі пристрій Android з безпекою?
j10

Відповіді:


39

Якщо припустити, що мова йде про OAuth 2.0, оскільки мова йде про JWT та оновлення жетонів ...:

  1. подібно до маркера доступу, в принципі маркер оновлення може бути будь-яким, включаючи всі описані вами варіанти; JWT може бути використаний, коли сервер авторизації хоче бути без громадянства або хоче застосувати якусь семантику "підтвердження володіння" для клієнта, який його представляє; зауважте, що маркер оновлення відрізняється від маркера доступу тим, що він подається не на сервер ресурсів, а лише на сервер авторизації, який видав його в першу чергу, тому автономна оптимізація перевірки JWTs-as-access-tokens робить не тримати для оновлення маркерів

  2. це залежить від безпеки / доступу до бази даних; якщо доступ до бази даних можуть отримати інші учасники / сервери / програми / користувачі, то так (але ваш пробіг може змінюватися залежно від того, де і як ви зберігаєте ключ шифрування ...)

  3. Сервер авторизації може видавати одночасно і маркери доступу, і оновлювати маркери, залежно від гранту, який використовується клієнтом для їх отримання; специфікація містить реквізити та параметри кожного з стандартизованих грантів


31
2. Ви повинні зберігати хэш маркера оновлення у вашій базі даних, а потім порівнювати хеш маркера оновлення користувача з вашим збереженим хешем. Тут випливає правило "не зберігати звичайні текстові паролі у вашій базі даних". Розгляньте маркер як випадковий пароль, який ви створили для користувача.
Ромер

2
Крім того, якщо ви хочете забезпечити більшу безпеку, виконайте також обертання токена оновлення. Важливість цього вже згадується в ITEF RFC 6749 . Якщо правильно реалізовано, це також може допомогти визначити сценарій крадіжки жетонів, тобто оновити маркер, викрадений зловмисником. Якщо ви шукаєте кращого пояснення, перейдіть
Bhumil Sarvaiya

82

Нижче наведено кроки для відкликання вашого маркера доступу JWT:

  1. Коли ви входите в систему, надішліть у відповідь клієнту 2 жетони (маркер доступу, оновити маркер).
  2. Маркер доступу матиме менше терміну дії, а Refresh буде тривалим.
  3. Клієнт (передній кінець) зберігатиме маркер оновлення у своєму локальному сховищі та маркер доступу у файлах cookie.
  4. Клієнт використовуватиме маркер доступу для виклику API. Але коли він закінчується, виберіть маркер оновлення з локального сховища та зателефонуйте API сервера аутентифікації, щоб отримати новий маркер.
  5. Ваш авторський сервер буде відкритий API, який прийме маркер оновлення та перевірить його дійсність та поверне новий маркер доступу.
  6. Після закінчення терміну оновлення користувач вийде з системи.

Будь ласка, повідомте мені, якщо вам потрібні додаткові деталі, я можу поділитися кодом (Java + Spring boot).

Для ваших питань:

Q1: Це ще один JWT з меншою кількістю претензій, поданих із тривалим терміном дії.

Q2: не буде в базі даних. Бекенд нікуди не зберігатиметься. Вони просто розшифрують маркер із приватним / відкритим ключем і також підтвердять його час його закінчення.

Q3: Так, правильно


28
Я думаю, що JWT слід зберігати в, localStorageа refreshTokenслід зберігати в httpOnly. refreshToeknМоже бути використаний , щоб отримати новий JWT тому він повинен бути оброблений з додатковою обережністю.
Tnc Андрій

2
Спасибі, що ви маєте на увазі під зберіганням у httpOnly? Чому б не зберігати обидва в localStorage?
Джей

8
мені не вистачає переваг використання маркера оновлення, чи не збігатиметься термін дії маркера доступу?
користувач2010955

3
@Jay За версією Microsoft Developer Network, HttpOnly - це додатковий прапор, включений до заголовка відповіді HTTP Set-Cookie. Використання прапора HttpOnly при створенні файлу cookie допомагає зменшити ризик доступу скрипта на стороні клієнта до захищеного файлу cookie (якщо браузер його підтримує).
тінь0359

23
№2 є дуже неточним. Токен оновлення повинен зберігатися на стороні сервера. Ви не повинні використовувати "автономну" властивість JWT для позначення оновлення. Це не дає можливості відкликати оновлені маркери, окрім зміни приватного ключа.
Джай Шарма

26

На основі цієї реалізації з Node.js JWT з маркером оновлення :

1) У цьому випадку вони використовують uid і це не JWT. Коли вони оновлюють маркер, вони надсилають маркер оновлення та користувача. Якщо ви реалізуєте його як JWT, вам не потрібно надсилати користувача, оскільки він би знаходився всередині JWT.

2) Вони реалізують це в окремому документі (таблиці). Для мене це має сенс, оскільки користувач може входити в різні клієнтські програми, і це може мати ознаку оновлення в додатку. Якщо користувач втратить пристрій із встановленим одним додатком, маркер оновлення цього пристрою може бути недійсним, не впливаючи на інші пристрої, які ввійшли в систему.

3) У цій реалізації він реагує на метод входу з обома, маркер доступу та маркер оновлення. Мені це здається правильним.


Висловлюючись "1) У цьому випадку вони використовують uid ..." Ви мали на увазі UUID?
озанмуї

Що про цю більш просту реалізацію - Випустіть JWT - надішліть старіший JWT, коли ви хочете оновити - (можна перевірити за iatдопомогою вікна) - перевидайте новий на основі попереднього
adonese

@adonese, надіславши лише те, що JWTви маєте намір матиrefresh_token всередині нього? Якщо так, OAuth RFC 6749 прямо говорить, що не надсилати refresh_tokenна ресурсний сервер (а JWTнадіслати на сервери ресурсів): tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.