What's the right OAuth 2.0 flow for a mobile app

Refresh

November 2018

Views

39.3k time

59

I am trying to implement delegated authorization in a Web API for mobile apps using OAuth 2.0. According to specification, the implicit grant flow does not support refresh tokens, which means once an access token is granted for an specific period of time, the user must grant permissions to the app again once the token expires or it is revoked. I guess this is a good scenario for some javascript code running on a browser as it is mentioned in the specification. I am trying to minimize the times the user must grant permissions to the app to obtain a token, so it looks like the Authorization Code flow is a good option as it supports refresh tokens. However, this flow seems to rely heavily on a web browser for performing the redirections. I am wondering if this flow is still a good option for a mobile app if a embedded web browser is used. Or should I go with the implicit flow ?

5 answers

21

К сожалению, я не думаю, что есть четкий ответ на этот вопрос. Однако, здесь есть варианты, которые я определены:

  • Если это нормально , чтобы спросить у пользователя его / ее полномочий, а затем использовать владелец ресурса Пароль учетные данные . Однако, это не может быть возможно по ряду причин, а именно :

    • Юзабилити или политики безопасности запрещают ввод пароля непосредственно в приложении
    • Процесс аутентификации делегированы на внешнем поставщика услуг идентификации и должны быть выполнены с помощью перенаправления потока на основе HTTP (например, OpenID, SAMLP или WS-Federation)
  • Если требуется использование потока на основе браузера, а затем использовать код авторизации Flow . Здесь, определение 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 перенаправления ответов.

Надеюсь это поможет

Pedro

-4

Гладкий пользовательский опыт для проверки подлинности, и легче всего реализовать, чтобы внедрить WebView в приложении. Процесс ответы, полученные с помощью WebView с точки аутентификации и обнаружения ошибок (пользователь отмена) или одобрение (и извлекать маркер из параметров запроса URL). И я думаю, что вы можете сделать это на всех платформах. Я успешно сделал эту работу следующим образом: ИОС, андроид, Mac, Windows 8.1 магазин приложений, Windows Phone 8.1 приложения. Я сделал это для следующих услуг: Dropbox, Google Диск, onedrive, коробка, Basecamp. Для неосновного окна платформы, я использую Xamarin, который якобы не раскрывает всю платформу конкретных API-интерфейсов, но она достаточно выставить за это стали возможным. Так что это довольно доступное решение, даже с точки зрения кросс платформенной, и вы не»

57

Пояснение: Mobile App = родное приложение

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

Native App OAuth2 Best Practices

Какой бы подход вы выбираете (есть несколько компромиссов , чтобы рассмотреть), следует обратить внимание на лучшие практики , как описано здесь Native Apps с помощью 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/ , который гласит ,

В настоящее время промышленность лучшая практика заключается в использовании авторизации Flow, а опуская секрет клиента, и использовать внешний агент пользователя, чтобы завершить поток. Внешний агент пользователя, как правило, родной браузер устройства, (с отдельным доменом безопасности из родного приложения,), так что приложение не может получить доступ к памяти печенья или проверять или изменять содержимое страницы в браузере.

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 просмотров Рассмотрение

Есть много примеров в дикой природе , используя веб - просмотры т.е. внедренного агента пользователя , но этот подход следует избегать (особенно , когда приложение не является первой стороны) , а в некоторых случаях может привести к вам запретили от использования API в выдержке ниже от здесь демонстрирует

Любая попытка встроить страницу аутентификации OAuth 2.0 приведет в приложении запрета от API FitBit.

Для рассмотрения безопасности, страница авторизации OAuth 2.0 должна быть представлена ​​в отдельном окне обозревателя. пользователи FitBit могут только подтвердить их подлинность с подлинным сайтом Fitbit.com, если у них есть средства, предоставляемые браузер, например, в строке URL и Transport Layer Security (TLS) информации о сертификате.

Для родных приложений, это означает, что страница авторизации необходимо открыть в браузере по умолчанию. Собственные приложения могут использовать собственные схемы URL в качестве перенаправления URI, чтобы перенаправить пользователя из браузера приложения, запрашивающего разрешение.

IOS приложение может использовать класс SFSafariViewController вместо приложения переключения в Safari. Использование класса WKWebView или UIWebView запрещено.

Android приложения могут использовать Chrome пользовательских вкладок вместо переключения приложений в браузере по умолчанию. Использование WebView запрещено.

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

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

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

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

Поощрение пользователей вводить учетные данные во встроенном вебе-зрениях без обычной адресной строки и других особенностей идентичности, что браузеры имеют не позволяет пользователю знать, если они подписывают в правомерном место, и даже тогда, когда они, тренирует их что это нормально, чтобы ввести учетные данные без проверки сайта первым.

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

В связи с вышеизложенным, использование встроенных пользовательских агентов не рекомендуется, кроме случаев, когда доверенные первых сторонние приложения выступают в качестве внешнего USER- агента для других приложений, или обеспечивает единый вход для нескольких приложений первой партии.

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

Некоторые интересные моменты также подняты здесь: https://security.stackexchange.com/questions/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the-

6

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

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

Неявный тип гранта является довольно популярным с мобильными приложениями. Но это не должно было быть использовано , как это. Есть проблемы безопасности вокруг перенаправления. Джастин побогаче государство :

Проблема возникает, когда вы понимаете, что в отличие от URL удаленного сервера, не существует надежный способ гарантировать, что связывание между данными перенаправлением URI и конкретное мобильное приложением почитаются. Любое приложение на устройстве может попытаться внедриться в процесс перенаправления и заставить его служить перенаправлять URI. И угадайте, что: если вы использовали неявный поток в вашем родном приложении, то вы просто передал злоумышленнику свой маркер доступа. Там нет никакого восстановления с этого момента - у них есть маркер, и они могут использовать его.

И вместе с тем, что она не позволяет обновить маркер доступа, лучше избегать.

Тип 2. Код авторизации Grant

Субсидия код авторизации требует секрет клиента. Но вы не должны хранить конфиденциальную информацию в исходном коде вашего мобильного приложения. Люди могут извлечь их. Чтобы не подвергать секрет клиента, вы должны запустить сервер в качестве посредника в Facebook пишет :

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

Не идеальное решение , но есть новый, лучший способ сделать OAuth на мобильных устройствах: Proof Ключ для кода биржи

3. Код авторизации Grant Тип с PKCE (Proof Ключ для кода биржи)

Из - за ограничений, новая техника была создана , что позволит вам использовать код авторизации без клиента секрета. Вы можете прочитать полный RFC 7636 или краткое введение .

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

Он используется в первую очередь отечественными и мобильными приложениями, но метод может быть применен к любому общественному клиенту, а также. Это требует дополнительной поддержки со стороны сервера авторизации, поэтому он поддерживается только на определенных поставщиков.

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

-2

Использование WebView в своем мобильном приложении должно быть доступным способом реализации протокола OAuth 2.0 на Android платформы.

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

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