Який правильний потік OAuth 2.0 для мобільного додатка


88

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

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

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


1
Питання полягало б у тому - чи це як найвищий пріоритет, коли користувачеві більше ніколи не доведеться вводити пароль знову після першого входу?
leastprivilege

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

1
Ви можете додати маркер із нескінченним терміном служби і все одно відкликати його. І так, логіка програми повинна вміти це виявляти. RFC 6750 визначає спосіб перевірки, чи помилка пов’язана з анульованим маркером.
Педро Фелікс

1
Будь ласка, уникайте веб-переглядів (якщо ви не володієте повним стеком і не використовуєте соціальний логін), які відкривають можливість компрометації паролів. Коли мене запитує облікові дані сторонній вбудований агент користувача, я видалю програму. Деякі API зараз навіть забороняють такі інтеграції, як-от цей dev.fitbit.com/docs/oauth2. Я надав іншу відповідь для подальшого роз’яснення деяких з цих концепцій ( stackoverflow.com/a/38582630/752167 )
Метт С,

Відповіді:


90

Уточнення: Мобільний додаток = Рідний додаток

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

Основні методи використання OAuth2 для власного додатка

Який би підхід ви не вибрали (є кілька компромісів, на які слід звернути увагу), вам слід звернути увагу на найкращі практики, описані тут для рідних додатків, що використовують OAuth2: https://tools.ietf.org/html/rfc8252

Розглянемо наступні варіанти

Неявна

Чи слід використовувати неявний?

Процитую розділ 8.2 https://tools.ietf.org/html/rfc8252#section-8.2

Потік неявного дозволу OAuth 2.0 (визначений у Розділі 4.2 OAuth 2.0 [RFC6749]), як правило, працює з практикою виконання запиту авторизації у браузері та отримання відповіді авторизації за допомогою інтерфейсу зв'язку на основі URI.
Однак, оскільки неявний потік не може бути захищений PKCE [RFC7636] (що потрібно в Розділі 8.1), використання Імпліцитного потоку з власними програмами НЕ РЕКОМЕНДУЄТЬСЯ .

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

Код дозволу

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

Витяг нижче з: https://dev.fitbit.com/docs/oauth2/

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

Примітка: Ніколи не вкладайте клієнтський секрет у розподілений код, наприклад програми, завантажені через магазин програм або на стороні клієнта JavaScript.

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

Висновок

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

Чудове читання тут https://auth0.com/blog/oauth-2-best-practices-for-native-apps/

Інший - https://www.oauth.com/oauth2-servers/oauth-native-apps/, де вказано

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

Розгляд PKCE

Ви також повинні розглянути PKCE, який описаний тут https://www.oauth.com/oauth2-servers/pkce/

Зокрема, якщо ви також впроваджуєте сервер авторизації, https://www.oauth.com/oauth2-servers/oauth-native-apps/checklist-server-support-native-apps/ стверджує, що вам слід

  • Дозволити клієнтам реєструвати власні схеми URL-адрес для своїх URL-адрес переспрямування.
  • Підтримка URL-адрес переспрямування IP із зворотним зв'язком із довільними номерами портів для підтримки програм на робочому столі.
  • Не думайте, що рідні програми можуть зберігати таємницю. Вимагайте, щоб усі програми заявляли, є вони загальнодоступними чи конфіденційними, і видавати секретні клієнтські секрети лише конфіденційним програмам.
  • Підтримуйте розширення PKCE і вимагайте, щоб його використовували публічні клієнти.
  • Спроба виявити, коли інтерфейс авторизації вбудований у веб-перегляд власного додатка, а не запускається в системному браузері, і відхилити ці запити.

Розгляд веб-переглядів

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

Будь-яка спроба вбудувати сторінку автентифікації OAuth 2.0 призведе до заборони вашої програми з API Fitbit.

З міркувань безпеки сторінка авторизації OAuth 2.0 повинна бути представлена ​​у виділеному поданні браузера. Користувачі Fitbit можуть підтвердити автентичність на справжньому сайті Fitbit.com, лише якщо вони мають інструменти, надані браузером, такі як рядок URL-адреси та інформація про сертифікат транспортного рівня (TLS).

Для рідних програм це означає, що сторінка авторизації повинна відкриватися в браузері за замовчуванням. Власні програми можуть використовувати власні схеми URL-адрес як перенаправляючі URI, щоб перенаправити користувача назад із браузера до програми, що вимагає дозволу.

Додатки iOS можуть використовувати клас SFSafariViewController замість переходу програми на Safari. Використання класу WKWebView або UIWebView заборонено.

Додатки Android можуть використовувати спеціальні вкладки Chrome замість того, щоб перемикатися на браузер за замовчуванням. Використання WebView заборонено.

Для подальшого пояснення, ось цитата з цього розділу попереднього проекту посилання на найкращі практики, наведеного вище

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

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

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

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

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

У зв’язку з вищезазначеним, використання вбудованих агентів користувача НЕ РЕКОМЕНДУЄТЬСЯ, за винятком випадків, коли надійний власний додаток виступає зовнішнім агентом користувача для інших програм або забезпечує єдиний вхід для кількох сторонніх програм.

Сервери авторизації ПОВИННІ розглянути кроки для виявлення та блокування входів через вбудовані агенти користувачів, які не є їхніми, де це можливо.

Деякі цікаві моменти також піднімаються тут: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- a


3
Google видаляє підтримку веб-переглядів 20 квітня 2017 р. Developers.googleblog.com/2016/08/…
Метт С,

FYI посилання на документ на початку цієї відповіді, якщо більше не складати
Костянтин

Дякую @KostiantynSokolinskyi, відповідним чином відредаговано з посиланням на rfc, яке більше не є чернетками
Matt C,

@MattC Який найкращий спосіб здійснити реєстрацію нового користувача? Чи варто це робити в додатку чи на ВПО? Чи можна автоматично ввійти до реєстру користувачів? stackoverflow.com/questions/60187173 / ...
Yashvit

Вибачте, я бентежу деякі деталі ... Не могли б ви поглянути? Дякую! посилання ---> stackoverflow.com/q/61313694/4619958
ch271828n

25

На жаль, я не думаю, що існує чітка відповідь на це питання. Однак, ось варіанти, які я визначив:

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

    • Політика юзабіліті або безпеки забороняє вставляти пароль безпосередньо в програму
    • Процес автентифікації делегується зовнішньому постачальнику ідентифікаційних даних і повинен виконуватися через потік на основі перенаправлення HTTP (наприклад, OpenID, SAMLP або WS-Federation)
  • Якщо потрібне використання потоку, заснованого на браузері, використовуйте Потік коду авторизації . Тут визначення поняття redirect_uriє основною проблемою, для якої існують такі варіанти:

    • Використовуйте техніку, описану в https://developers.google.com/accounts/docs/OAuth2InstalledApp , де спеціальний redirect_uri(наприклад urn:ietf:wg:oauth:2.0:oob) сигналізує кінцевій точці авторизації, щоб показати код авторизації замість перенаправлення назад у клієнтську програму. Користувач може скопіювати цей код вручну, або програма може спробувати отримати його із заголовка документа HTML.
    • Використовуйте localhostсервер на пристрої (управління портами може бути непростим).
    • Використовуйте власну схему URI (наприклад myapp://...), яка, коли адресація викликає зареєстрований "обробник" (деталі залежать від мобільної платформи).
    • Якщо доступно, використовуйте спеціальний "веб-перегляд", такий як WebAuthenticationBroker у Windows 8, для керування та доступу до переадресації HTTP.

Сподіваюся, це допомагає

Педро


Дякую Педро за вступ !. Так, схоже, найкращим варіантом тут є потік коду авторизації зі спеціальною схемою URI або Web View.
Пабло Сібраро,

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

Дякую Домініку! Мій клієнт використовує ADFS для автентифікації користувачів, тому вони хочуть ввести облікові дані на сторінці входу. Для них працюватиме веб-перегляд
Пабло Сібраро

5
Мені цікаво, чому ви рекомендуєте "потік коду авторизації"? Вам не потрібні client_secret і client_id для обміну коду на маркер доступу? Я думав, що "неявний" потік був розроблений для цих сценаріїв, оскільки він не вимагає зберігання секретів у пристрої.
Eugenio Pace

1
неявний не підтримує маркери оновлення OOB. У сценарії Пабло - я чітко рекомендую потік RO. Звучить, що розгорнуті компанією програми проти того самого серверного сервера компанії.
leastprivilege

9

TL; DR: Використовуйте наданий код авторизації разом з PKCE

1. Неявний тип гранту

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

Проблема виникає, коли ви усвідомлюєте, що на відміну від URL-адреси віддаленого сервера, немає надійного способу забезпечити дотримання прив’язки між даним URI перенаправлення та конкретною мобільною програмою. Будь-яка програма на пристрої може спробувати вставити себе в процес переспрямування та змусити її обслуговувати URI переспрямування. І вгадайте: якщо ви використовували неявний потік у власному додатку, то ви просто передали зловмисникові маркер доступу. З цього моменту відновлення немає - у них є маркер, і вони можуть ним скористатися.

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

2. Код дозволу Тип надання

Надання коду авторизації вимагає секрету клієнта. Але не слід зберігати конфіденційну інформацію у вихідному коді вашого мобільного додатка. Люди можуть їх видобувати. Щоб не викривати таємницю клієнта, вам слід запустити сервер як посередника, як пише Facebook :

Ми рекомендуємо використовувати маркери доступу до додатків лише безпосередньо із серверів вашого додатка, щоб забезпечити найкращий захист. Для власних додатків ми пропонуємо, щоб програма взаємодіяла з вашим власним сервером, а потім сервер робив запити API до Facebook за допомогою маркера доступу до програм.

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

3. Тип надання коду авторизації з PKCE (ключ підтвердження для обміну кодами)

Поза обмеженнями було створено нову техніку, яка дозволяє використовувати код авторизації без секрету клієнта. Ви можете прочитати повний RFC 7636 або цей короткий вступ .

PKCE (RFC 7636) - це метод захисту публічних клієнтів, які не використовують клієнтську таємницю.

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

з https://oauth.net/2/pkce/


-4

Використання веб-перегляду у вашому мобільному додатку має стати доступним способом реалізації протоколу OAuth2.0 на платформі Android.

Що стосується поля redirect_uri, то, на мою думку http://localhost, це хороший вибір, і вам не потрібно переносити HTTP-сервер всередину вашої програми, оскільки ви можете перевизначити реалізацію onPageStartedфункції в WebViewClientкласі та припинити завантаження веб-сторінки http://localhostпісля перевірки urlпараметра.

public void onPageStarted(final WebView webView, final String url,
        final Bitmap favicon) {}

3
Найкращі практики для власних
Метт С,

1
Як сказав Метт С, вище. Веб-перегляди - погана ідея для мобільних додатків - вони небезпечні, дозволяють додатку отримувати доступ до облікових даних (отже, не більш безпечним, ніж RO) і не дозволяють користувачам перевіряти сертифікати домену та TLS. Використовуйте тип надання коду авторизації із користувацьким обробником URI та переконайтеся, що ви використовуєте код перевірки для обміну ключами (PKCE), щоб зупинити шкідливі програми на вашому телефоні, перехоплюючи код автентифікації та отримуючи доступ до вашого API.
ChrisC

2
Оновлена ​​версія проекту документа OAuth 2.0 для найкращих практик Native Apps знаходиться на tools.ietf.org/html/draft-ietf-oauth-native-apps
Джефф Олсон,

-5

Найпростіший інтерфейс користувача для автентифікації та найпростіший у впровадженні - це вбудування веб-перегляду у ваш додаток. Обробляйте відповіді, отримані веб-переглядом з точки автентифікації, та виявляйте помилку (скасування користувачем) або затвердження (і витягуйте маркер із параметрів запиту url). І я думаю, ви насправді можете це зробити на всіх платформах. Я успішно здійснив цю роботу для таких додатків: ios, android, mac, windows store 8.1 apps, windows phone 8.1 app. Я зробив це для таких служб: dropbox, google drive, onedrive, box, basecamp. Для платформ, що не стосуються Windows, я використовував Xamarin, який, мовляв, не виставляє цілі API для певної платформи, проте він виявив достатньо, щоб це стало можливим. Отже, це досить доступне рішення, навіть з точки зору міжплатформної платформи, і ви цього не робите


Надаючи зручний інтерфейс для користувачів, ми побачимо, що галузь відходить від цього підходу. Оскільки веб-перегляди відкривають можливість компрометації паролів, коли в мене запрошує облікові дані вбудований агент користувача, я видаляю програму. Деякі API зараз навіть забороняють такі інтеграції, як-от цей dev.fitbit.com/docs/oauth2
Matt C

Найкращі практики для власних
Метт С,

Я не розумію, як сервіс із підтримкою аудіо може заборонити такий підхід. Це неможливо виявити та безпечно ... Деякі служби, що підтримують oauth, надають клієнтам певної платформи полегшення автентифікації, і такі клієнти насправді виконують те, що я описав тут (показують вбудований веб-перегляд і відстежують зміни URL-адрес). Найкраща практика, яку ви зв’язали, рекомендує те саме: використовувати системний браузер або вбудований веб-перегляд. Який аргумент ви атакуєте з моєї відповіді? незрозуміло.
Раду Сіміонеску

Жодна атака не передбачається, лише висвітлення проблеми. У посиланні сказано, що є два підходи, про які ви згадали, але лише зовнішній користувальницький агент може вважатися захищеним, зокрема йдеться про параметри для власних програм "через вбудований агент користувача або зовнішній агент користувача. Цей документ рекомендує зовнішній користувальницькі агенти, такі як вкладки веб-переглядача в додатку, як єдиний безпечний та корисний вибір для OAuth "
Matt C

Подальша цитата "У типових реалізаціях вбудованих агентів користувача, заснованих на веб-перегляді, програма-хост може: реєструвати кожне натискання клавіш, введене у форму, щоб фіксувати імена користувачів та паролі; автоматично подавати форми та обходити згоду користувача" ....... "використання вбудованих агентів користувача НЕ РЕКОМЕНДУЄТЬСЯ, за винятком випадків, коли довірений власний додаток виступає зовнішнім агентом користувача для інших програм або забезпечує єдиний вхід для декількох сторонніх додатків. Сервери авторизації ПОВИННІ розглянути кроки для виявляти та блокувати входи через вбудовані агенти користувачів, які не є їхніми, де це можливо ".
Matt C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.