Какъв е правилният OAuth 2.0 поток за мобилно приложение

Опитвам се да внедря делегирана оторизация в уеб API за мобилни приложения, използващи OAuth 2.0. Съгласно спецификацията имплицитният поток на предоставяне не поддържа токени за опресняване, което означава, че след като токен за достъп бъде предоставен за определен период от време, потребителят трябва да даде разрешения на приложението отново, след като токенът изтече или бъде отменен.

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

Този поток обаче изглежда разчита до голяма степен на уеб браузър за извършване на пренасочванията. Чудя се дали този поток все още е добър вариант за мобилно приложение, ако се използва вграден уеб браузър. Или трябва да следвам имплицитния поток?


person Pablo Cibraro    schedule 02.07.2013    source източник
comment
Въпросът би бил - като най-висок приоритет ли е, че потребителят никога повече не трябва да въвежда парола след първото влизане?   -  person leastprivilege    schedule 02.07.2013
comment
Да, точно това е моето изискване. Потребителят трябва да въведе паролата само веднъж. Не искам обаче да настроя токен с безкраен живот и да го запазя в мобилното приложение, тъй като това би противоречило на възможността за отмяна на токена. (Освен ако не добавя някаква логика в мобилното приложение, за да открия, че заявката е била неоторизирана, така че след това поискам нов токен)   -  person Pablo Cibraro    schedule 02.07.2013
comment
Можете да добавите токен с безкраен живот и пак да го отмените. И да, логиката на приложението трябва да може да открие това. RFC 6750 дефинира начин за проверка дали грешката се дължи на отменен токен.   -  person Pedro Felix    schedule 02.07.2013
comment
Моля, избягвайте уеб изгледи (освен ако не притежавате пълния стек и не използвате социално влизане), които отварят възможността за компрометиране на пароли. Когато бъда помолен за идентификационни данни от вграден потребителски агент на трета страна, бих деинсталирал приложението. Някои API вече дори забраняват такива интеграции като това dev.fitbit.com/docs/oauth2 Предоставих друг отговор за допълнително изясняване на някои от тези концепции (stackoverflow.com/a/38582630/752167)   -  person Matt C    schedule 26.07.2016


Отговори (5)


Пояснение: Мобилно приложение = родно приложение

Както е посочено в други коментари и няколко източника онлайн, имплицитното изглежда като естествено подходящо за мобилни приложения, но най-доброто решение не винаги е ясно (и всъщност имплицитното не се препоръчва поради причините, обсъдени по-долу).

Най-добри практики за 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/, което гласи

Настоящата най-добра практика в индустрията е да се използва потокът за оторизация, като се пропуска тайната на клиента и да се използва външен потребителски агент за завършване на потока. Външен потребителски агент обикновено е собственият браузър на устройството (с отделен домейн за сигурност от собственото приложение), така че приложението да не може да има достъп до хранилището на бисквитки или да инспектира или променя съдържанието на страницата в браузъра.

Разглеждане на 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 адреси за пренасочване.
  • Поддържайте обратни IP пренасочващи URL адреси с произволни номера на портове, за да поддържате настолни приложения.
  • Не предполагайте, че родните приложения могат да пазят тайна. Изисквайте всички приложения да декларират дали са публични или поверителни и издавайте клиентски тайни само на поверителни приложения.
  • Поддържайте разширението PKCE и изисквайте публичните клиенти да го използват.
  • Опитайте се да откриете кога интерфейсът за оторизация е вграден в уеб изгледа на собствено приложение, вместо да се стартира в системен браузър, и отхвърлете тези заявки.

Разглеждане на изгледи в мрежата

Има много примери в дивата природа с използване на Web Views, т.е. вграден потребителски агент, но този подход трябва да се избягва (особено когато приложението не е от първа страна) и в някои случаи може да доведе до забрана за използване на API като извадка по-долу от тук демонстрира

Всеки опит за вграждане на страницата за удостоверяване на OAuth 2.0 ще доведе до забрана на вашето приложение от Fitbit API.

От съображения за сигурност страницата за оторизация на OAuth 2.0 трябва да бъде представена в специален изглед на браузъра. Потребителите на Fitbit могат да потвърдят, че се удостоверяват само с оригиналния сайт Fitbit.com, ако разполагат с инструментите, предоставени от браузъра, като URL лентата и информацията за сертификата за сигурност на транспортния слой (TLS).

За родните приложения това означава, че страницата за оторизация трябва да се отвори в браузъра по подразбиране. Родните приложения могат да използват персонализирани URL схеми като URI за пренасочване, за да пренасочат потребителя обратно от браузъра към приложението, което иска разрешение.

Приложенията за iOS може да използват класа SFSafariViewController вместо превключване на приложението към Safari. Използването на класа WKWebView или UIWebView е забранено.

Приложенията за Android може да използват персонализирани раздели на Chrome вместо приложението да превключва към браузъра по подразбиране. Използването на WebView е забранено.

За допълнително пояснение, ето цитат от този раздел на предишен проект на връзката за най-добра практика, предоставена по-горе

Вградените потребителски агенти, обикновено имплементирани с уеб изгледи, са алтернативен метод за оторизиране на собствени приложения. Те обаче не са безопасни за използване от трети страни по дефиниция. Те включват потребителя да влезе с пълните си идентификационни данни за вход, само за да ги намали до по-малко мощни идентификационни данни за OAuth.

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

В типични базирани на уеб изглед реализации на вградени потребителски агенти, хост приложението може: да регистрира всяко натискане на клавиш, въведено във формуляра, за да улови потребителски имена и пароли; автоматично изпращане на формуляри и заобикаляне на съгласието на потребителя; копирайте сесийни бисквитки и ги използвайте за извършване на удостоверени действия като потребител.

Насърчаването на потребителите да въвеждат идентификационни данни във вграден уеб изглед без обичайната адресна лента и други функции за самоличност, които браузърите имат, прави невъзможно потребителят да знае дали влиза в легитимния сайт и дори когато влиза в него, той ги обучава че е добре да въвеждате идентификационни данни, без първо да потвърдите сайта.

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

Поради горепосоченото използването на вградени потребителски агенти НЕ СЕ ПРЕПОРЪЧВА, освен когато доверено приложение на първа страна действа като външен потребителски агент за други приложения или осигурява единично влизане за множество приложения на първа страна.

Сървърите за оторизация ТРЯБВА да обмислят предприемането на стъпки за откриване и блокиране на влизания чрез вградени потребителски агенти, които не са техни собствени, когато е възможно.

Тук също се повдигат някои интересни точки: https://security.stackexchange.com/questions/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the-a

person Matt C    schedule 26.07.2016
comment
Google премахва поддръжката за уеб изгледи на 20 април 2017 г. developers.googleblog.com/2016/08/ - person Matt C; 09.03.2017
comment
За информация препратките към документа в началото на този отговор, ако вече не е чернова, OAuth 2.0 за собствени приложения - tools.ietf. org/html/rfc8252 - person Kostiantyn Sokolinskyi; 28.01.2018
comment
Благодаря @KostiantynSokolinskyi, редактиран съответно с връзка за rfc, който вече не е чернова - person Matt C; 23.03.2018
comment
@MattC Кой е най-добрият начин за реализиране на регистрация на нов потребител? Трябва ли да го направим в приложението или на IDP? Възможно ли е автоматично влизане в регистъра на потребителските публикации? stackoverflow.com/ въпроси/60187173/ - person Yashvit; 13.02.2020
comment
Съжалявам, че съм объркан относно някои подробности... Бихте ли погледнали, моля? Благодаря! връзка ---› stackoverflow.com/q/61313694/4619958 - person ch271828n; 20.04.2020

За съжаление не мисля, че има ясен отговор на този въпрос. Ето обаче опциите, които идентифицирах:

  • Ако е добре да попитате потребителя за неговите/нейните идентификационни данни, тогава използвайте Идентификационните данни за парола за собственик на ресурс. Това обаче може да не е възможно поради някои причини, а именно

    • Usability or security policies forbid the insertion of the password directly at the app
    • Процесът на удостоверяване е делегиран на външен доставчик на идентичност и трябва да се извърши чрез базиран на HTTP пренасочване поток (напр. OpenID, SAMLP или WS-Federation)
  • Ако се изисква използване на поток, базиран на браузър, тогава използвайте Потока на кода за оторизация. Тук дефиницията на redirect_uri е голямо предизвикателство, за което има следните опции:

    • Use the technique described in https://developers.google.com/accounts/docs/OAuth2InstalledApp, where a special redirect_uri (e.g. urn:ietf:wg:oauth:2.0:oob) signals the authorization endpoint to show the authorization code instead of redirecting back to the client app. The user can manually copy this code or the app can try to obtain it from the HTML document title.
    • Използвайте localhost сървър на устройството (управлението на портовете може да не е лесно).
    • Използвайте персонализирана URI схема (напр. myapp://...), която при дерефериране задейства регистриран „манипулатор“ (подробностите зависят от мобилната платформа).
    • Ако е наличен, използвайте специален „уеб изглед“, като например WebAuthenticationBroker в Windows 8, за да контролирате и достъп до HTTP пренасочващите отговори.

Надявам се това да помогне

Педро

person Pedro Felix    schedule 02.07.2013
comment
Благодаря на Педро за приноса!. Да, изглежда, че потокът на кода за оторизация с персонализираната URI схема или уеб изгледът изглежда е най-добрият вариант тук. - person Pablo Cibraro; 02.07.2013
comment
Всичко зависи от това дали искате клиентът да въведе паролата в уеб изглед или в клиентското приложение. Ако е възможно, бих предпочел клиентското приложение - след това незабавно обменете тайната с токен за достъп/опресняване. - person leastprivilege; 02.07.2013
comment
Благодаря Доминик!. Моят клиент използва ADFS за удостоверяване на потребителите, така че те искат да въведат идентификационните данни в страницата за вход. Уеб изгледът ще им свърши работа - person Pablo Cibraro; 02.07.2013
comment
Интересно ми е защо бихте препоръчали потока на кода за оторизация? Няма ли да имате нужда от client_secret и client_id, за да обмените кода за access_token? Мислех, че неявният поток е предназначен за тези сценарии, защото не изисква тайни да се съхраняват в устройството. - person Eugenio Pace; 02.07.2013
comment
implicit не поддържа токени за опресняване OOB. В сценария на Пабло - аз ясно бих препоръчал RO поток. Звучи като приложения, внедрени от компанията срещу същия бекенд на компанията. - person leastprivilege; 02.07.2013
comment
Предполагам, че имплицитният поток би попречил да се случат подобни неща, нали? threatpost.com/twitter-oauth-api-keys-leaked-030713 - person Pablo Cibraro; 02.07.2013
comment
Теоретично човек може да използва кодов поток с публични клиенти. Все пак трябва да има начин за създаване на клиенти за всяка инсталация, където client_secret се присвоява за конкретна инсталация. Надявах се, че спецификацията за динамична регистрация на клиент ще въведе известна поддръжка за това, но не изглежда така. - person Pedro Felix; 02.07.2013
comment
@EugenioPace Аз също препоръчвам същото всъщност. Не е нужно да губите време, за да направите своя собствена форма за вход по този начин. По този начин интерфейсът за влизане е специфичен за услугата, с която се удостоверявате, и това кара потребителя да се чувства по-удобно. - person Radu Simionescu; 18.02.2015
comment
@EugenioPace е прав тук. И моля, избягвайте изгледи в мрежата, които отварят възможността за компрометиране на пароли. Когато бъда помолен за идентификационни данни от вграден потребителски агент, бих деинсталирал приложението. Някои API вече дори забраняват такива интеграции като това dev.fitbit.com/docs/oauth2 Предоставих друг отговор за допълнително изясняване на някои от тези концепции (stackoverflow.com/a/38582630/752167) - person Matt C; 26.07.2016
comment
Съжалявам, че съм объркан относно някои подробности... Бихте ли погледнали, моля? Благодаря! връзка ---› stackoverflow.com/q/61313694/4619958 - person ch271828n; 20.04.2020

TL;DR: Използвайте Предоставяне на код за оторизация с PKCE

1. Вид имплицитно предоставяне

Неявният тип грант е доста популярен при мобилните приложения. Но не беше предназначено да се използва по този начин. Има опасения за сигурността около пренасочването. Джъстин Ричър заявява:

Проблемът идва, когато осъзнаете, че за разлика от URL адреса на отдалечен сървър, няма надежден начин да се гарантира, че обвързването между даден URI за пренасочване и конкретно мобилно приложение се спазва. Всяко приложение на устройството може да се опита да се вмъкне в процеса на пренасочване и да го накара да обслужва URI адреса за пренасочване. И познайте какво: ако сте използвали имплицитния поток в собственото си приложение, тогава току-що сте предали на атакуващия своя маркер за достъп. Няма възстановяване от тази точка —„те имат токена и могат да го използват.

И заедно с факта, че не ви позволява да опресните токена за достъп, по-добре го избягвайте.

2. Тип предоставяне на код за оторизация

Предоставянето на код за оторизация изисква клиентска тайна. Но не трябва да съхранявате поверителна информация в изходния код на вашето мобилно приложение. Хората могат да ги извлекат. За да не разкриете тайната на клиента, трябва да стартирате сървър като посредник, както пише във Facebook :

Препоръчваме токените за достъп до приложението да се използват само директно от сървърите на приложението ви, за да се осигури най-добрата сигурност. За местни приложения предлагаме приложението да комуникира с вашия собствен сървър и сървърът след това да прави API заявки към Facebook, използвайки App Access Token.

Не е идеално решение, но има нов, по-добър начин за извършване на OAuth на мобилни устройства: Ключ за доказване за обмен на код

3. Тип предоставяне на код за упълномощаване с PKCE (ключ за доказателство за обмен на код)

От ограниченията беше създадена нова техника, която ви позволява да използвате кода за оторизация без клиентска тайна. Можете да прочетете пълния RFC 7636 или това кратко въведение.

PKCE (RFC 7636) е техника за защита на публични клиенти, които не използват клиентска тайна.

Използва се предимно от собствени и мобилни приложения, но техниката може да се приложи и към всеки публичен клиент. Изисква допълнителна поддръжка от сървъра за оторизация, така че се поддържа само от определени доставчици.

от https://oauth.net/2/pkce/

person Johannes Filter    schedule 06.03.2018

Използването на уеб изглед във вашето мобилно приложение трябва да бъде достъпен начин за внедряване на протокол 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) {}
person Zephyr    schedule 20.02.2015
comment
Най-добри практики за собствени приложения, използващи OAuth2: tools.ietf.org/html/ draft-wdenniss-oauth-native-apps - person Matt C; 26.07.2016
comment
Както Мат С каза по-горе. Уеб изгледите са лоша идея за мобилни приложения - те са несигурни, позволяват на приложението да получи достъп до идентификационните данни (така че не е по-сигурно от RO) и не позволяват на потребителите да проверяват домейн и TLS сертификати. Използвайте Auth Code grant type с персонализиран URI манипулатор и се уверете, че използвате доказателствен код за обмен на ключове ( PKCE), за да спрете злонамерените приложения на телефона ви да прихващат кода за удостоверяване и да получават достъп до вашия API. - person ChrisC; 01.08.2016
comment
Актуализираната версия на документа с най-добри практики за OAuth 2.0 за OAuth 2.0 за собствени приложения е на адрес tools .ietf.org/html/draft-ietf-oauth-native-apps - person Jeff Olson; 26.09.2016

Най-плавното потребителско изживяване за удостоверяване и най-лесното за внедряване е да вградите уеб изглед в приложението си. Обработете отговорите, получени от уеб изгледа от точката за удостоверяване и открийте грешка (анулиране от потребителя) или одобрение (и извлечете токен от параметрите на заявката на url). И мисля, че всъщност можете да направите това във всички платформи. Успешно направих тази работа за следното: ios, android, mac, приложения за Windows Store 8.1, приложение за Windows Phone 8.1. Направих това за следните услуги: dropbox, google drive, onedrive, box, basecamp. За платформите без Windows използвах Xamarin, за който се предполага, че не излага всички специфични за платформата API, но все пак изложи достатъчно, за да направи това възможно. Така че това е доста достъпно решение, дори от гледна точка на различни платформи, и не е нужно да се притеснявате за потребителския интерфейс на формуляра за удостоверяване.

person Radu Simionescu    schedule 17.02.2015
comment
Докато предоставяме удобно потребителско изживяване, ще видим как индустрията се отдалечава от този подход. Тъй като уеб изгледите отварят възможността за компрометиране на пароли, когато бъда помолен за идентификационни данни от вграден потребителски агент, бих деинсталирал приложението. Някои API вече дори забраняват такива интеграции като това dev.fitbit.com/docs/oauth2 - person Matt C; 26.07.2016
comment
Най-добри практики за собствени приложения, използващи OAuth2: tools.ietf.org/html/ draft-wdenniss-oauth-native-apps - person Matt C; 26.07.2016
comment
Не виждам как услуга с активиран oauth може да забрани този подход. Той е неоткриваем и безопасен... Някои услуги с активиран oauth предоставят клиенти, специфични за платформата, за да улеснят удостоверяването, и такива клиенти всъщност правят това, което описах тук (показват вграден уеб изглед и проследяват промените на url). Най-добрата практика, която сте свързали, препоръчва същото нещо: използвайте системен браузър или вграден уеб изглед. Какъв аргумент атакувате от отговора ми? не е ясно. - person Radu Simionescu; 26.07.2016
comment
Не е целенасочена атака, само подчертаване на проблема. Връзката казва, че има двата подхода, които споменавате, но само външен потребителски агент може да се счита за сигурен, по-конкретно се казва, че опциите за собствени приложения са чрез вграден потребителски агент или външен потребителски агент. Този документ препоръчва външни потребителски агенти като раздели на браузъра в приложението като единствения сигурен и използваем избор за OAuth. - person Matt C; 26.07.2016
comment
Допълнителен цитат В типични базирани на уеб изглед реализации на вградени потребителски агенти, хост приложението може: да регистрира всяко натискане на клавиш, въведено във формуляра, за да улови потребителски имена и пароли; автоматично изпращане на формуляри и заобикаляне на съгласието на потребителя.......използването на вградени потребителски агенти НЕ СЕ ПРЕПОРЪЧВА, освен когато доверено приложение на първа страна действа като външен потребителски агент за други приложения или осигурява единично влизане за множество приложения на първа страна. Сървърите за оторизация ТРЯБВА да обмислят предприемането на стъпки за откриване и блокиране на влизания чрез вградени потребителски агенти, които не са техни собствени, когато е възможно. - person Matt C; 26.07.2016
comment
Актуализираната версия на документа с най-добри практики за OAuth 2.0 за OAuth 2.0 за собствени приложения е на адрес tools .ietf.org/html/draft-ietf-oauth-native-apps - person Jeff Olson; 26.09.2016