OAuth 2.0: Переваги та випадки використання - чому?


256

Чи може хто-небудь пояснити, що добре в OAuth2 і чому ми повинні його реалізувати? Я прошу, бо я трохи збентежений з цього приводу - ось мої нинішні думки:

Запити OAuth1 (точніше HMAC) здаються логічними, зрозумілими, легкими у розробці та справді, дуже безпечними.

Натомість OAuth2 приносить запити на авторизацію, доступ до маркерів та оновлення маркерів, і вам потрібно зробити 3 запити на самому початку сеансу, щоб отримати дані, які ви шукаєте. І навіть тоді один із ваших запитів в кінцевому підсумку закінчиться невдачею, коли маркер закінчиться.

А щоб отримати ще один маркер доступу, ви використовуєте маркер оновлення, який був переданий одночасно з маркером доступу. Чи робить це маркер доступу з точки зору безпеки безрезультатним?

Крім того, як нещодавно показав / r / netsec, SSL не є повністю захищеним, тому поштовх перевести все на TLS / SSL замість захищеного HMAC мене бентежить.

OAuth стверджують, що справа не в 100% безпеці, а в тому, щоб опублікувати та закінчити. З точки зору постачальника це не дуже перспективно. Я бачу, чого намагається досягнути проект, коли згадується про 6 різних потоків, але це просто не вкладається в мою голову.

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


Відповіді:


324

Передумови: я написав стеки клієнтів і серверів для OAuth 1.0a та 2.0.

Як OAuth 1.0a, так і 2.0 підтримують двосторонній аутентифікацію , де сервер впевнений в ідентичності користувача, і триногу автентифікацію , коли сервер забезпечується постачальником контенту про особу користувача. Тристороння аутентифікація - це те, коли починають грати запити на авторизацію та маркери доступу, і важливо зазначити, що OAuth 1 теж має.

Складний: триногий аутентифікацію

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

Не надто глибоко заглиблюючись у деталі OAuth:

  1. Клієнт подає сервер запит на авторизацію, який підтверджує, що клієнт є законним клієнтом своєї послуги.
  2. Сервер перенаправляє клієнта до постачальника вмісту, щоб запитувати доступ до його ресурсів.
  3. Постачальник вмісту підтверджує особу користувача та часто просить їх дозволу на доступ до ресурсів.
  4. Постачальник контенту перенаправляє клієнта назад на сервер, повідомляючи його про успіх чи збій. Цей запит включає код авторизації щодо успіху.
  5. Сервер робить позапрофільний запит до постачальника вмісту та обмінюється кодом авторизації на маркер доступу.

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

Кожен обмін (клієнт-> сервер, сервер-> постачальник вмісту) включає перевірку загальної таємниці, але оскільки OAuth 1 може працювати через незашифроване з'єднання, кожна перевірка не може передавати секрет через провід.

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

Цей підпис вимагає, щоб і клієнт, і сервер домовились про порядок аргументів (тому вони підписують точно однаковий рядок), і одна з головних скарг на OAuth 1 полягає в тому, що він вимагає як сервера, так і клієнтів сортувати і підписувати однаково. Це химерний код, і це правильно, або ви отримуєте 401 Unauthorizedз невеликою допомогою. Це збільшує бар’єр для написання клієнтом.

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

Такі самі вимоги є і в підключенні сервера до постачальника вмісту, і оскільки це SSL, що усуває один бар'єр для написання сервера, який отримує доступ до послуг OAuth.

Це значно спрощує дії на кроках 1, 2 та 5 вище.

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

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

Спосіб, який вирішується в OAuth 2, - це ознака оновлення . Маркер оновлення стає постійним еквівалентом пароля, і він передається тільки через SSL . Коли сервер потребує доступу до служби вмісту, він обміняє маркер оновлення на короткочасний маркер доступу. Таким чином, всі нюхаючі доходи HTTP робляться з маркером, який закінчується. Google використовує 5-хвилинний термін дії своїх API-дисків OAuth 2.

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

Дві ноги аутентифікації

Однак іноді серверу просто потрібно контролювати доступ до власного вмісту. Двостороння аутентифікація дозволяє клієнту аутентифікувати користувача безпосередньо з сервером.

OAuth 2 стандартизує деякі розширення до OAuth 1, які широко використовувались. Той, кого я найкраще знаю, був представлений у Twitter як xAuth . Ви можете бачити його в OAuth 2 як ідентифікатори пароля власника ресурсу .

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

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

Я щойно реалізував серверну частину OAuth 2 з використанням облікових даних власників ресурсів, і з точки зору клієнта отримання маркера доступу стало простим: запросити маркер доступу з сервера, передавши ідентифікатор / секрет клієнта як заголовок авторизації HTTP та логін / пароль користувача як дані форми.

Перевага: простота

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

І це кодифікує в стандарт деякі розширення до OAuth 1.0a (як xAuth), які зараз широко використовуються.


20
Щодо термінології: Було б краще, якщо ви дотримуєтесь офіційних імен постраждалих сторін (сервер авторизації, сервер ресурсів, власник ресурсів), а не використовувати незрозумілі (клієнт, сервер, користувач ..).
Айдін К.

Привіт Пітер, ти можеш змінити свою посаду з сервером авторизації, сервером ресурсів, власником ресурсу .. іменем клієнта, сервера, користувача .. як каже Айдін К. Це здебільшого допомагає початківцям. Дякую.
JustCode

@Aydin K Ви можете прокоментувати порівняння сервера авторизації, сервера ресурсів, власника ресурсу імені клієнта, сервера, користувача. Тому що я також новий для Aouth.
JustCode

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

7

По-перше, як чітко зазначено в аутентифікації OAuth

OAuth 2.0 не є протоколом аутентифікації.

Аутентифікація у контексті користувача, який отримує доступ до програми, повідомляє програмі, хто є поточним користувачем та чи є вони. Повний протокол аутентифікації, ймовірно, також повідомить вам про деякі атрибути цього користувача, такі як унікальний ідентифікатор, електронна адреса та те, як їх зателефонувати, коли додаток говорить "Доброго ранку".

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

Існує стандарт аутентифікації користувача за допомогою OAuth: OpenID Connect, сумісний з OAuth2.

Маркер ID ID OpenID Connect - це підписаний веб-маркер JSON (JWT), який надається клієнтській програмі поряд зі звичайним маркером доступу OAuth. Токен ідентифікатора містить набір претензій щодо сеансу аутентифікації, включаючи ідентифікатор для користувача (підрозділу), ідентифікатор для постачальника ідентифікаторів, який видав маркер (iss), та ідентифікатор клієнта, для якого цей маркер створений ( ауд).

У програмі Go можна переглядати coreos / dex, ідентифікатор OpenID Connect (OIDC) та постачальник OAuth 2.0 із роз'ємом, що підключається.

Відповідь з цього повідомлення vonc


Отже, якби ви створювали додаток, де крім ваших власних клієнтів не було б ніяких додаткових клієнтів, чи реалізувати OAuth було б навіть доцільно? Або краще дотримуватися прямої автентифікації HTTP Basic, повністю уникаючи OAuth?
CristianHG

3

Я відповів би на це питання дещо інакше, і буду дуже точним і коротким, головним чином тому, що @Peter T відповів на це всім.

Основна користь, яку я бачу від цього стандарту, - це дотримання двох принципів:

  1. Поділ проблем.
  2. Роз'єднання автентифікації від веб-програми, яка зазвичай служить бізнесу.

Роблячи це,

  1. Ви можете застосувати альтернативу Single SignOn: якщо у вас є кілька додатків, які довіряють одній STS. Що я маю на увазі, одне ім’я користувача для всіх програм.
  2. Ви можете дозволити веб-додатку (Клієнту) отримати доступ до ресурсів, які належать користувачеві та не належать до веб-програми (Клієнт).
  3. Ви можете доручити процес аутентифікації третій стороні, якій ви довіряєте, і ніколи не турбуйтеся про перевірку автентичності користувача.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.