Чому OAuth v2 має як маркер доступу, так і оновлення?


654

Розділ 4.2 проекту протоколу OAuth 2.0 вказує, що сервер авторизації може повернути як access_token(який використовується для автентифікації себе з ресурсом), так і a refresh_token, який використовується виключно для створення нового access_token:

https://tools.ietf.org/html/rfc6749#section-4.2

Чому обоє? Чому б просто не зробити access_tokenостаннього до тих пір, як refresh_tokenі не мати refresh_token?

Відповіді:


463

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

Оновлення жетонів, якщо вони порушені, марні, тому що зловмисник вимагає ідентифікатор клієнта та секрет на додаток до маркера оновлення, щоб отримати маркер доступу.

Сказавши це , оскільки кожен виклик як сервера авторизації, так і сервера ресурсів здійснюється через SSL - включаючи оригінальний ідентифікатор клієнта та секрет, коли вони запитують маркери доступу / оновлення - я не впевнений у тому, як маркер доступу більше є » компромісний ", ніж довготривалий маркер оновлення та поєднання між клієнтами та секретами.

Звичайно, це відрізняється від реалізацій, де ви не керуєте як серверами авторизації, так і ресурсами.

Ось хороший потік, який розповідає про використання токенів оновлення: OAuth Archives .

Цитата з вищесказаного, що говорить про цілі безпеки маркера оновлення:

Оновлення жетонів ... зменшує ризик тривалої протікання access_token (параметр запитів у файлі журналу на незахищеному ресурсному сервері, бета-версія або погано закодований додаток сервера ресурсів, клієнт JS SDK на веб-сайті, який не є https, який ставить access_token у печиво тощо)


14
Catchdave має рацію, але подумав, що я додам, що все розвивалося з часу його первинної відповіді. Використання SSL тепер необов’язкове (про це, мабуть, все ще обговорювали, коли відповідь у відповідь). Наприклад, маркери MAC (наразі в стадії розробки) надають можливість підписувати запит приватним ключем, щоб SSL не був необхідним. Оновлення жетонів, таким чином, стає дуже важливим, оскільки ви хочете мати недовгові макетони mac.
AlexGad

54
"Оновлення жетонів, якщо вони порушені, є марними, оскільки зловмисник потребує ідентифікатора клієнта та секрету на додаток до маркера оновлення для отримання маркера доступу." Але ідентифікатор клієнта та секрет також зберігаються в пристрої, чи не так? Тож зловмисник з доступом до пристрою може отримати їх. Тоді чому? Тут, github.com/auth0/lock/wiki/Using-a-Refresh-Token , написано, що втратити маркер Refresh означає, що він може запитати стільки авторів жетонів, скільки хоче, можливо, не в сценарії googles, але що робити, якщо я реалізую власний сервер oauth2?
Jamsheed Kamarudeen

42
"Зловмисник вимагає клієнтського ідентифікатора та секрету на додаток до маркера оновлення, щоб отримати маркер доступу" : тоді яка різниця між використанням маркера оновлення та просто відставки?
sp00m

34
Маркер оновлення може використовуватися третьою стороною, яка може поновити маркер доступу без будь-якого знання облікових даних користувачів.
Марек

27
@KevinWheeler Ні, ідентифікатор клієнта та секрет - це облікові дані для клієнта OAuth, а не для користувача. Якщо говорити про OAuth, то "клієнтом" зазвичай є сервер (наприклад, веб-сервер stackoverflow), який взаємодіє з сервером API авторизації або ресурсом (наприклад, провайдер авторизації facebook). Повноважні дані користувача передаються лише між користувачем та сервером API OAuth і ніколи не відомі клієнту. Клієнтська таємниця передається лише від клієнта на сервер API OAuth і ніколи не відома користувачеві.
машинна туга

551

Посилання на дискусію, надане Кеттдевом, має ще один дійсний пункт (оригінал, мертве посилання), зроблений Діком Хардтом, який, на мою думку, варто згадати тут, окрім написаного вище:

Мій пригадування знаків оновлення було для безпеки та відкликання. <...>

відкликання: якщо маркер доступу автономний, авторизацію можна відкликати, не видаючи нові маркери доступу. Ресурсу не потрібно запитувати сервер авторизації, щоб перевірити, чи маркер доступу дійсний. Це спрощує перевірку маркера доступу та полегшує масштабування та підтримку декількох серверів авторизації. Існує вікно часу, коли маркер доступу дійсний, але авторизація відкликана.

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

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

Як правило, маркери можуть бути або випадковими ідентифікаторами, що вказують на конкретний запис у базі даних Сервера, або вони можуть містити всю інформацію в собі (звичайно, ця інформація повинна бути підписана, наприклад, з MAC ).

Як повинна працювати система з довготривалими маркерами доступу

Сервер дозволяє Клієнту отримати доступ до даних Користувача в межах заздалегідь заданого набору областей, видаючи маркер. Оскільки ми хочемо, щоб маркер відкликався, ми повинні зберігати в базі даних маркер разом із встановленим або знятим прапором "відкликаний" (інакше як би ви це зробили з автономним токеном?) База даних може містити стільки, скільки len(users) x len(registered clients) x len(scopes combination)записів . Кожен запит API повинен потрапляти в базу даних. Хоча робити запити до такої бази даних, що виконує O (1), досить тривіально, одинична точка відмови сама по собі може мати негативний вплив на масштабованість та продуктивність системи.

Як має працювати система з довготривалим токеном оновлення та маркером короткочасного доступу

Тут ми видаємо два ключі: випадковий маркер оновлення з відповідним записом у базі даних та підписаний автономний маркер доступу, що містить серед інших поле часової позначки терміну дії.

Оскільки маркер доступу є самостійним, нам взагалі не потрібно потрапляти в базу даних, щоб перевірити її дійсність. Все, що нам потрібно зробити, - це розшифрувати маркер і перевірити підпис і мітку часу.

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

Щоб відкликати доступ Клієнта від конкретного Користувача, нам слід позначити відповідний маркер оновлення як "відкликаний" (або видалити його повністю) та припинити видавати нові маркери доступу. Хоча очевидно, що є вікно, під час якого маркер оновлення був відкликаний, але його маркер доступу все ще може бути дійсним.

Компроміси

Токни оновлення частково усувають SPoF (єдину точку відмови) бази даних Token Access, але вони мають деякі очевидні недоліки.

  1. Вікно". Час між подіями "користувач скасовує доступ" та "гарантовано буде скасовано доступ".

  2. Ускладнення логіки Клієнта.

    без ознаки оновлення

    • надіслати запит API з маркером доступу
    • якщо маркер доступу недійсний, відмовтеся і попросіть користувача повторно пройти автентифікацію

    з ознакою оновлення

    • надіслати запит API з маркером доступу
    • Якщо маркер доступу недійсний, спробуйте оновити його за допомогою маркера оновлення
    • якщо запит на оновлення пройде, оновіть маркер доступу та повторно надішліть початковий запит API
    • Якщо запит на оновлення не вдається, попросіть користувача пройти повторну автентифікацію

Я сподіваюся, що ця відповідь має сенс і допомагає комусь прийняти більш продумане рішення. Хотілося б також зазначити, що деякі відомі постачальники OAuth2, включаючи github та fourrsquare, приймають протокол без оновлення жетонів, і, мабуть, задоволені цим.


4
@RomannImankulov Якщо я розумію, що правильно оновити маркер, ми можемо зберегти в db та видалити їх у будь-який час, коли ми хочемо відкликати доступ, то чому б не зберегти маркери доступу самостійно?
kosnkov

30
@kosnkov, коротка версія моєї публікації полягає в тому, що якщо ви зберігаєте маркер доступу в базі даних, ви натискаєте базу даних на кожен запит до вашого API (що може бути, а може, і не бути проблемою у вашому конкретному випадку). Якщо ви зберігаєте токни оновлення та зберігаєте маркери доступу "автономними", ви потрапляєте в базу даних лише тоді, коли клієнт вирішить оновити маркер доступу.
Роман Іманкулов

5
Особисто мені не подобається, що такий підхід не вражає базу даних для отримання продуктивності, якщо вона збирається поставити під загрозу безпеку (навіть якщо тільки за часовий проміжок часу). При необхідності потрібно негайно відкликати access_token, оскільки майже завжди ми маємо справу з конфіденційною інформацією користувачів (інакше ми, швидше за все, не використовуємо OAuth). Цікаво, який підхід використовують більші компанії, такі як Facebook та Google.
Тіаго

1
Я не повністю розумію, чому нам доводиться мати «вікно відкритим» деякий час. Чому ми не можемо просто надіслати запит на сервер ресурсів, щоб не прийняти маркери доступу для цього користувача? Також я маю рацію, що ви не можете оновити маркерну поведінку, коли у вас немає секрету клієнта для підписання жетонів? Тому в основному ви не можете користуватися оновленнями жетонів із програмного забезпечення на пристроях із програмами cliemts, мобільними програмами для настільних пристроїв тощо.
Ігор Чордаш

1
@PSIXO ресурсний сервер не має жодного постійного сховища, окрім бази даних та, можливо, локального кешу. Таким чином, єдиний спосіб перевірити, чи маркер відкликаний - це натискання на базу даних, чого і намагається уникнути весь цей процес. Що стосується вашого 2-го питання, ви неправі. Якщо у вас є маркер оновлення, ви можете подати запит на нові маркери доступу.
bernie

199

Незважаючи на всі чудові відповіді, наведені вище, я, як студент-магістр безпеки та програміст, який раніше працював на eBay, коли я розглядав захист покупців та шахрайство, можу сказати, що розділення маркера доступу та оновлення токена має найкращий баланс між домаганням користувача частого імені користувача / введення пароля та зберігаючи повноваження в руці, щоб скасувати доступ до можливих зловживань вашою послугою.

Придумайте такий сценарій. Ви видаєте користувачеві маркер доступу 3600 секунд і оновлюєте маркер набагато довше, як один день.

  1. Користувач - хороший користувач, він вдома і отримує / вимикає покупки та пошук на своєму веб-сайті на своєму iPhone. Його IP-адреса не змінюється і має дуже низьке навантаження на ваш сервер. Як і 3-5 запитів на сторінку щохвилини. Коли його 3600 секунд на маркері доступу закінчено, йому потрібен новий з маркером оновлення. Ми з боку сервера перевіряємо його історію активності та IP-адресу, думаємо, що він людина і поводиться сам. Ми надаємо йому новий маркер доступу, щоб продовжувати користуватися нашою службою. Користувачеві не потрібно буде вводити знову ім’я користувача / пароль, поки він не досяг одноденного періоду життя самого жетона оновлення.

  2. Користувач - недбалий користувач. Він проживає в Нью-Йорку, США та закрив вірусну програму, а хакер зламався в Польщі . Коли хакер отримав маркер доступу та оновить маркер, він намагається представити себе користувачем та скористатися нашою послугою. Але після закінчення терміну дії короткого режиму доступу, коли хакер намагається оновити маркер доступу, ми на сервері помітили різку зміну IP-адреси в історії поведінки користувачів (так, цей хлопець заходить у США, а тепер оновив доступ у Польщі після всього 3600-х років ???). Ми припиняємо процес оновлення, анулюємо сам маркер оновлення та вимагаємо знову ввести ім'я користувача / пароль.

  3. Користувач - шкідливий користувач. Він покликаний зловживати нашою послугою, телефонуючи 1000 разів наш API щохвилини за допомогою робота. Він цілком може зробити це до 3600 секунд пізніше, коли він намагається оновити маркер доступу, ми помітили його поведінку і думаємо, що він може не бути людиною. Ми відхиляємо і припиняємо процес оновлення та просимо його знову ввести ім’я користувача / пароль. Це може потенційно порушити автоматичний потік його робота. Принаймні, йому стає незручно.

Ви можете бачити, що маркер оновлення діяв ідеально, коли ми намагаємось збалансувати роботу, досвід користувача та потенційний ризик викраденого маркера. Ваша сторожова собака на стороні сервера може перевірити більше, ніж зміни IP, частоту api-дзвінків, щоб визначити, чи буде користувач хорошим користувачем чи ні.

Ще одне слово - ви також можете спробувати обмежити контроль за пошкодженням вкраденого токена / зловживання службою, застосовуючи на кожному дзвінку api основну собаку для спостереження за IP або будь-які інші заходи. Але це дорого, оскільки вам доведеться читати і писати записи про користувача і сповільнюватиме відповідь вашого сервера.


@laalaguer Чи є у вас більш чітко виражені політики, наприклад, наприклад: Не відкликайте маркер, коли зміниться IP-адреса користувача (коли мобільний телефон відключається від WiFi та підключається до мережі 3G / 4G)?
svlada

65
Це кілька чудових політик та ідей, але я не бачу у вашій відповіді нічого, що по суті вимагає використання ознак оновлення. Усі ці функції можна реалізувати лише за допомогою маркера доступу.
Еверт

12
@Evert, однією з переваг використання обох токенів доступу та оновлення є те, що маркери доступу можуть бути короткочасними, і тому це не надто великий компроміс із безпекою, щоб довіряти їм беззастережно, не перевіряючи з сервером, який їх спочатку видав. Це дозволяє дозволити масштабування інфраструктури, щоб некритичні її частини могли довіряти інформації, що зберігається в (підписаному) маркері, без прямого доступу до інформації облікового запису користувача.
Avi Cherry

7
@Avi Cherry - Так, маркер доступу може бути короткочасним, а також може бути оновлений, якщо користувач все-таки вважається дійсним. Для цього не потрібен маркер оновлення.
Рік Джоллі

10
Я вважаю, що ця відповідь передбачає, що ми ніколи не хочемо, щоб сервери ресурсів самі здійснювали розширений контроль доступу (наприклад, перевіряли IP-активність щодо різних баз даних тощо), і замість цього вони можуть покладатися лише на перевірку маркера доступу в повній ізоляції. Хоча це може бути очевидним у масштабі (з міркувань ефективності), але явно не очевидно для всіх тут, враховуючи плутанину в інших публікаціях та коментарях. Це хороший пост з приємною інформацією, але я відчуваю, що він дуже не вистачає точки оригінального питання. Я рекомендую принаймні зробити вищезазначене припущення явним.
TNE

72

Жоден із цих відповідей не доходить до основної причини, коли існують маркери оновлення. Очевидно, що ви завжди можете отримати нову пару доступу-маркер / refresh-token, надіславши облікові дані свого клієнта на сервер auth - саме так ви їх отримаєте в першу чергу.

Тож єдиною метою маркера оновлення є обмеження використання облікових даних клієнта, що надсилаються по дроту до служби аутентифікації. Чим коротший ttl маркера доступу, тим частіше доведеться використовувати облікові дані клієнта для отримання нового маркера доступу, а отже, тим більше можливостей зловмисникам доводиться компрометувати облікові дані клієнта (хоча це все-таки може бути дуже складно, якщо для їх надсилання використовується асиметричне шифрування). Отже, якщо у вас є ток оновлення для одноразового використання, ви можете зробити ttl токенів доступу довільно невеликим, не порушуючи облікові дані клієнта.


16
Це цікаво, як у випадку Google, коли ви запитуєте маркер оновлення, ви також надсилаєте ідентифікатор клієнта та секрет клієнта. Тож ви все одно робите компроміс щогодини.
Rots

1
Олександр, насправді чим коротший ttl, тим частіше клієнту доведеться отримати новий маркер доступу (що вимагає використання облікових даних клієнта). Тож я насправді маю на увазі «коротше». Я додам примітку, щоб уточнити.
BT

2
"єдине призначення" - не миється. Зробити TTL маркера доступу до тих пір, поки у уявленого маркера оновлення буде досягнуто так само.
Ревінь

8
Оскільки стандарт вимагає, щоб облікові дані клієнта надсилалися разом із маркером оновлення, передумова цієї відповіді просто хибна. "Оскільки токни оновлення зазвичай є довготривалими обліковими записами, які використовуються для запиту додаткових жетонів доступу ... клієнт ПОВИНЕН аутентифікуватись на сервері авторизації." Також дивіться коментар @Rots.
Кевін Крістофер Генрі

8
А) Я думаю, ви змішуєте клієнтські таємниці та секрети користувачів. Секрет клієнта ніколи не надсилається з користувальницького пристрою, лише з програми доступу до бекенда до даних, що надають програмну програму. B) Сервер oAuth, який дозволяє надати пароль для публічного клієнта (клієнт, який не може зберігати клієнтську таємницю, наприклад, рідний або javascript-додаток), також надасть довідку оновлення для цього публічного клієнта, таким чином, вам не потрібно надішліть клієнтську таємницю під час оновлення вашого маркера. C) Токен оновлення надає бекенду "hart-beat", коли потрібно перевірити дійсність користувача!
Андреас Лундгрен

55

Щоб усунути певну плутанину, ви повинні зрозуміти ролі секрету клієнта та пароля користувача , які дуже відрізняються.

Клієнт є додаток / сайт / програма / ..., при підтримці сервера, який хоче аутентифицировать на користувача за допомогою служби аутентифікації третьою стороною. Секрет клієнта - це (випадкова) рядок, яка відома як цьому клієнту, так і серверу аутентифікації. Використовуючи цей секрет, клієнт може ідентифікувати себе з сервером аутентифікації, отримавши авторизацію на запит жетонів доступу.

Щоб отримати початковий маркер доступу та оновити маркер, потрібно:

  • Ідентифікатор користувача
  • Пароль користувача
  • Ідентифікатор клієнта
  • Клієнтська таємниця

Для отримання оновленого маркера доступу клієнт використовує таку інформацію:

  • Ідентифікатор клієнта
  • Клієнтська таємниця
  • Маркер оновлення

Це чітко показує різницю: під час оновлення клієнт отримує дозвіл на оновлення токенів доступу, використовуючи його секрет клієнта, і, таким чином, може повторно аутентифікувати користувача, використовуючи маркер оновлення замість ідентифікатора користувача + пароля. Це фактично не дозволяє користувачеві повторно вводити свій пароль.

Це також показує, що втратити маркер оновлення не є проблемою, оскільки ідентифікатор клієнта та секрет не відомі. Це також показує, що зберігати таємницю клієнта та клієнтську таємницю є життєво важливим .


1
"Це також показує, що втратити маркер оновлення не є проблемою, оскільки ідентифікатор клієнта та секрет не відомі". Але вони мені не потрібні. Якщо я отримав маркер оновлення, я можу передати його на ваш сервер додатків. Він додає client_id та секрет, а потім передає всі три до служби OAuth. У чому справа?
3DFace

7
Сервер додатків не надає спосіб подати маркер оновлення самостійно, ви не можете попросити його генерувати новий маркер аутентифікації, надаючи йому маркер оновлення. Він поновлює токен аутентичності, коли потрібно, "поза кадром".
Adversus

2
Зауважте, що вам справді потрібен секрет клієнта, щоб отримати маркер оновлення в першу чергу. Можливо, ви думаєте про неявний потік автентифікації, де вам не потрібен секрет, але маркери оновлення не видаються і не використовуються в цьому випадку.
Кевін Крістофер Генрі

@KevinChristopherHenry подібного роду припускає, що для кінцевого користувача, який просто увійшов на веб-сайт компанії XYZ.com, маркер оновлення безглуздо отримати новий маркер доступу для XYZ.com? Але жетоном оновлення може бути будь-яка невідповідна рядок - як настанова - зберігається в таблиці, яку можна знайти дуже швидко. Тоді як маркер доступу може бути набагато довшим і складніше індексувати в базі даних. Тож оновлений маркер МОЖЕТ зберігатися та мати переваги на стороні кінцевого користувача. [хоча оскільки це питання говорить про oauth2, можливо, будь-які відповіді без сторонньої служби, яка діє від імені людини, все одно не є актуальною]
Simon_Weaver

чому ви не можете просто передати "Ідентифікатор клієнта" + "Клієнтська таємниця" + "Маркер доступу минув", щоб отримати новий маркер доступу?
Мед

37

Ця відповідь отримана від Джастіна Рішера через стандартний список електронних листів OAuth 2. Це розміщено з його дозволу.


Термін служби маркера оновлення залежить від сервера авторизації (AS) - вони можуть закінчуватися, відкликатись і т. Д. Різниця між маркером оновлення та маркером доступу полягає в аудиторії: маркер оновлення повертається лише до сервера авторизації, маркер доступу переходить до сервера ресурсів (RS).

Крім того, що отримати маркер доступу не означає, що користувач увійшов у систему. Насправді, користувача навіть більше не може бути там, що є фактично призначеним випадком використання маркера оновлення. Оновлення маркера доступу надасть вам доступ до API від імені користувача, воно не скаже вам, чи є користувач там.

OpenID Connect не просто дає вам інформацію про користувача з маркера доступу, але також дає вам ідентифікатор. Це окремий фрагмент даних, який спрямований на самого клієнта, а не на AS або RS. У OIDC вам слід вважати, що хтось насправді "увійшов" протоколом, лише якщо ви можете отримати новий маркер ідентифікатора. Освіжати її, мабуть, буде недостатньо.

Для отримання додаткової інформації читайте http://oauth.net/articles/authentication/


Це, мабуть, стосується OpenID Connect та аутентифікації, тому я не бачу, як це відповідає на питання, що стосується мотивації оновлення токена.
sleske

18

Клієнти можуть бути скомпрометовані багатьма способами. Наприклад, мобільний телефон можна клонувати. Термін дії маркера доступу закінчується означає, що клієнт змушений повторно пройти автентифікацію на сервері авторизації. Під час повторної аутентифікації сервер авторизації може перевірити інші характеристики (IOW виконувати адаптивне управління доступом).

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

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


2
"Оновлення жетонів дозволяють клієнту лише повторну автентифікацію ..." є важливим аспектом тут.
Джеймс

13

Чому б просто не зробити так, щоб access_token тривав до тих пір, як refresh_token, і не мати refresh_token?

На додаток до чудових відповідей, які надали інші люди, є ще одна причина, чому можна використовувати оновлення маркерів і пов'язане з претензіями.

Кожен маркер містить претензії, які можуть включати будь-що від імені користувача, їх ролі або постачальника, який створив претензію. У міру оновлення маркера ці претензії оновлюються.

Якщо ми часто оновлюємо жетони, ми, очевидно, піддаємо більше напруги нашим службам ідентифікації, однак ми отримуємо більш точні та актуальні претензії.


4
Було б незвичною поганою практикою ставити такі "претензії" в маркер доступу. Як описано в специфікації , маркер доступу "зазвичай непрозорий для клієнта". Чи є у вас приклади постачальників OAuth, які роблять це?
Кевін Крістофер Генрі

3
@heymega Коли роль користувача знижується з ADMIN на REGULAR_USER, очікується, що роль користувача потрібно негайно відкликати, а не після закінчення терміну доступу_token. Отже, схоже, що потрапляння до бази даних за кожним запитом неминуче.
svlada

@svlada Я думаю, що це був би випадок, коли програмі, що переводить сутність з ADMIN на REGULAR_USER, потрібно (у тому ж процесі) також відкликати відповідний маркер. тобто якщо ми знаємо, що претензії зміниться, ми не чекаємо закінчення терміну дії, ми відкликаємо негайно
e_i_pi

13

Щоб додатково спростити відповідь BT: Використовуйте маркери оновлення, коли зазвичай не потрібно, щоб користувач знову вводив облікові дані, але все ж хоче, щоб влада могла відкликати дозволи (відкликаючи маркер оновлення)

Ви не можете відкликати маркер доступу - лише маркер оновлення.


1
Ви можете відкликати маркер доступу, який вимагатиме або повторного входу в інший маркер доступу, або використання маркера оновлення для отримання іншого маркера доступу. Якщо маркер оновлення був недійсним, користувачеві доведеться повторно засвідчити автентифікацію, щоб отримати новий маркер доступу разом з новим маркером оновлення.
Atieh

10
Я не погоджуюсь. Маркер доступу видається сервером аутентифікації, підписується з датою закінчення терміну дії та надсилається клієнту. Коли клієнт надсилає цей маркер на сервер ресурсів, сервер ресурсів не зв'язується з сервером автентифікації, щоб перевірити маркер; він просто розглядає дату закінчення терміну дії в (підписаний і не підроблений) маркер. Отже, незалежно від того, що ви робите на сервері аутентифікації, щоб спробувати "відкликати", сервер ресурсів не хвилює. Деякі люди відносять вихід клієнта до відкликання (тобто клієнт видаляє його маркер), але, однак, це вводить в оману термінологію - ми хочемо "відкликати" маркер на сервері, а не клієнт
bitcoder

1
Не кажучи про те, що ви не можете написати спеціальний код, щоб ігнорувати певні лексеми (наприклад, тут stackoverflow.com/questions/22708046/… ), але це, мабуть, передбачає деякі мережеві поїздки від сервера ресурсів до сервера oauth / db щоразу, коли клієнт робить дзвінок. Ви уникаєте цих дзвінків, використовуючи оновлені маркери, і я думаю, що це більше відповідає тому, що мали намір автори oauth.
bitcoder

13

Цю відповідь було зібрано за допомогою двох старших розробників (Джон Брейтон та Девід Дженнес).

Основна причина використання маркера оновлення - зменшення атакуючої поверхні.

Припустимо, немає ключа оновлення, і перейдемо до цього прикладу:

У будинку 80 дверей. Усі двері відкриваються одним ключем. Клавіша змінюється кожні 30 хвилин. Після закінчення 30 хвилин я повинен дати старий ключ виробнику клавіш і отримати новий ключ.

Якщо я хакер і отримаю ваш ключ, то наприкінці 30 хвилин я пришвидшу його до клавішника і отримаю новий ключ. Я зможу постійно відкривати всі двері незалежно від зміни ключа.

Запитання: Протягом 30 хвилин скільки можливостей для взломів у мене було проти ключа? У мене було 80 можливостей для злому, кожного разу, коли ви використовували ключ (подумайте про це як за допомогою мережевого запиту та передачі маркера доступу, щоб ідентифікувати себе). Отже, це 80X атакова поверхня.

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

У будинку 80 дверей. Усі двері відкриваються одним ключем. Клавіша змінюється кожні 30 хвилин. Щоб отримати новий ключ, я не можу передавати старий маркер доступу. Я повинен лише здати ключ оновлення.

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

Питання: Скільки можливостей для злому було протягом 30 хвилин проти клавіші оновлення? 80? Ні. У мене була лише 1 можливість хакерства. Протягом часу кур'єр спілкується з виробником клавіш. Так це 1X атакова поверхня. У мене було 80 можливостей злому проти ключа, але вони не сприятливі через 30 хвилин.


Сервер перевірить маркер доступу на основі облікових даних та підпису (як правило) JWT.

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

Справа в тому, що маркер доступу додається до кожного запиту, який ви робите, тоді як маркер оновлення використовується лише під час потоку оновлення. Так менше шансів MITM побачити маркер

Частота допомагає зловмиснику. Серцеподібні -як потенційних вразливостей в SSL, потенційних вразливостей в клієнті, і потенційні недоліки безпеки на сервері все роблять витоку можливо.

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

Відсікання корисно для безпеки.

І останнє, але не в останню чергу, бачити цю дивовижну відповідь


Про який маркер оновлення НЕ йдеться?

Можливість оновлення / відкликання рівня доступу через маркери оновлення є побічним продуктом вибору використання токенів оновлення, інакше окремий маркер доступу може бути відкликаний або змінити рівень доступу, коли він закінчується, і користувачі отримують новий маркер


2
важко прослідкувати за цим порівнянням, оскільки питання різні. "" Протягом 30 хвилин, скільки можливостей для злому у мене було проти ключа? " (чи не було у мене ключа як хакера спочатку?) 2. "За 30 хвилин, скільки можливостей для злому у мене було проти кур'єра?". Якою була б "хакерська можливість"? Як хакер, чи не був у мене ключ в першу чергу?
Сеск

1
Ти правий. Я вніс зміни
мед

4

Припустимо, ти робиш access_tokenостаннє дуже довго, а цього не маєш refresh_token, тож за один день хакер отримає цеaccess_token і він може отримати доступ до всіх захищених ресурсів!

Але якщо у вас є refresh_token, час access_tokenу прямому ефірі короткий, тому хакер важко зламати ваш, access_tokenоскільки він буде недійсним через короткий проміжок часу. Access_tokenїх можна повернути лише за допомогою не тільки, refresh_tokenале й за допомогою client_idі client_secret, якого хакер не має.


2
"використовуючи не лише refresh_token, але й client_id та client_secret, яких у хакера немає." 1. припустимо, що це лише маркер доступу, то чи не потрібен хакер ще client_id та client_secret? 2. якщо хакер є хорошим хакером, він також може зламати client_id та client_secret. Незалежно від цієї частини, злом додаткових речей не повинен мати значення для порівняння, бо якщо це важко зламати, то його також важко зламати у випадку використання лише маркера доступу ... короткий виклад історії, ви не порівнюєте однакові ситуації. Ви їх змішуєте
Honey

2

Поки маркер оновлення зберігається сервером авторизації. Маркер доступу є автономним, тому сервер ресурсів може перевірити його, не зберігаючи його, що економить зусилля на пошук у разі перевірки. Ще один момент, який бракує в обговоренні, - це rfc6749 # page-55

"Наприклад, сервер авторизації може використовувати поворот маркера оновлення, в якому новий маркер оновлення видається з кожною відповіддю оновлення токена доступу. Попередній маркер оновлення недійсний, але зберігається сервером авторизації. Якщо маркер оновлення порушений і згодом використовується і зловмисник, і законний клієнт, один з них подасть недійсний маркер оновлення, який повідомить сервер авторизації про порушення ".

Я думаю, що вся суть використання маркера оновлення полягає в тому, що навіть якщо зловмиснику якось вдається отримати маркер оновлення, ідентифікатор клієнта та секретну комбінацію. З наступними дзвінками отримати новий маркер доступу від зловмисника можна відслідковувати у випадку, якщо кожен запит на оновлення призведе до нового маркера доступу та маркер оновлення.


Я думаю, що це дуже важливий момент :-) Це також - певною мірою - недійсно скасовує аргумент auth0.com/docs/tokens/refresh-token/current#restrictions щоA Single-Page Application (normally implementing Single-Page Login Flow) should not under any circumstances get a Refresh Token. The reason for that is the sensitivity of this piece of information. You can think of it as user credentials, since a Refresh Token allows a user to remain authenticated essentially forever. Therefore you cannot have this information in a browser, it must be stored securely.
Simon_Weaver

1

Розглянемо систему, де кожен користувач пов'язаний з однією або декількома ролями, і кожна роль пов'язана з одним або кількома привілеями доступу. Ця інформація може бути кешована для кращої продуктивності API. Але потім можуть відбутися зміни в конфігураціях користувача та ролей (наприклад, новий доступ може бути наданий або поточний доступ може бути відкликаний), і це повинно бути відображено в кеші.

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

Іншими словами, ми можемо переміщувати дорогі операції з кожного дзвінка API, використовуючи маркери доступу до події генерації маркера доступу, використовуючи маркер оновлення.


0

По-перше, клієнт аутентифікується на сервері авторизації, надаючи дозвіл авторизації.

Потім клієнт запитує сервер ресурсів для захищеного ресурсу, надаючи маркер доступу.

Сервер ресурсів перевіряє маркер доступу та надає захищений ресурс.

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

Якщо маркер доступу закінчується, клієнт аутентифікується на сервері авторизації та запитує новий маркер доступу, надаючи маркер оновлення. Якщо маркер доступу недійсний, сервер ресурсів відправляє клієнту назад недійсну відповідь на помилку маркера.

Клієнт аутентифікується на сервері авторизації, надаючи маркер оновлення.

Тоді сервер авторизації перевіряє маркер оновлення шляхом автентифікації клієнта і видає новий маркер доступу, якщо він дійсний.


Це насправді не вказує, звідки береться маркер оновлення. Я припускаю, що другий абзац повинен сказати access token + refresh token?
Simon_Weaver
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.