Мне нужно интегрировать OAuth2 в собственное приложение iOS и Android. Я изучал OAuth2 и мобильные приложения и нашел эту документацию - Google APIs - Using OAuth 2.0 for Installed ApplicationsИнтеграция oauth2 с мобильным приложением (iOS/Android)
В приведенной выше документации в основном подробно описано, как использовать конечную точку Goolge OAuth 2.0 в мобильных приложениях.
Вот что говорится в документе -
- При регистрации приложения, необходимо указать, что приложение является установленным приложением. Это приводит к другому значению параметра redirect_uri.
- Client_id и client_secret, полученные во время регистрации, встроены в исходный код вашего приложения. В этом контексте client_secret явно не рассматривается как секрет.
- Код авторизации может быть возвращен вашему приложению в строке заголовка браузера или в порт
http://localhost
в строке запроса.
Предположим, у пользователя установлено 2 приложения на смартфоне.
App1 - законное приложение потребляя Google OAuth2.0 конечной
app2 - злонамеренный приложение
Действительно, что я не уверен, является ли выше метода интегрирования/потребления OAuth2.0 конечной точки в пределах родной мобильный приложение небезопасно или я что-то упускаю. Вот мои вопросы -
- redirect_uri может быть
http://localhost
URL и может содержать любой номер порта. Номер порта не является частью первоначальной конфигурации API и, следовательно, может быть любым допустимым номером порта. Кроме того, client_id (в любом случае не должен быть секретом) и client_secret не являются действительно секретными, поскольку они встроены в исходный код мобильного приложения.
Используя вышеуказанные условия, не следующие возможности -
- Пользователь запускает app2
- App2 перенаправляет пользователя к конечной точке Google OAuth2.0 однако в запросе, App2 включает client_id для App1 и включает в себя номер локального порта, на котором прослушивает App2.
- Когда пользователь перенаправляется и аутентифицируется в конечной точке Google OAuth2.0, Google указывает пользователю, что «приложение App1 (законное приложение) запрашивает доступ к API/данным Google от имени пользователя», который выглядит как фишинг атака, так как пользователь может нажать «да», думая, что App1 запрашивает доступ.
- Google OAuth2.0 затем выдаст код авторизации, чтобы App2 и App2 могли затем сделать следующий запрос, включая client_id и client_secret от App1, и получить access_token и refresh_token и продолжить доступ к пользовательским данным из Google.
- redirect_uri также может быть - урны: IETF: Рабочая группа по OAuth: 2,0: OOB, что означает -
Это значение сигналов на сервер Google авторизации, что код авторизации должен быть возвращен в строке заголовка браузера. Это полезно, когда клиент не может прослушивать HTTP-порт без значительной конфигурации клиента. Приложения Windows обладают этой характеристикой.
Когда это значение используется, ваше приложение может почувствовать, что страница загружена, а заголовок страницы HTML содержит код авторизации. Затем ваше приложение закрывает окно браузера, если вы хотите, чтобы пользователь никогда не видел страницу, содержащую код авторизации. Механизм для этого варьируется от платформы к платформе.
Вышеупомянутое означает, что код авторизации возвращается в заголовке окна браузера.
Мой вопрос: может ли App2 также заметить, что страница загрузила и захватила код авторизации, а затем использовала ее (до App1) вместе с client_id и client_secret для получения access_token и refresh_token. Является ли экземпляр браузера глобальным, и любое приложение может его контролировать, и вышеупомянутый сценарий атаки действителен или является экземпляром браузера как-то специфичным для приложения, так что только App1 может отслеживать или отслеживать изменения?
Является ли мое понимание правильным ИЛИ Я что-то не хватает? Не хватает ли каких-либо смягчающих мер для смягчения вышеупомянутых угроз? ИЛИ Являются ли вышеуказанные риски действительными, но принимаются, учитывая, что мы находимся на платформе мобильной ОС?
Что такое безопасный способ использования OAuth2.0 в мобильных приложениях? - Отобразить код авторизации на странице браузера и ввести пользователя вручную в приложение? И в этом случае частный экземпляр браузера, чтобы другое приложение не могло его контролировать и получить код авторизации, прежде чем пользователь вводит его в законную апикацию?
Любая помощь приветствуется
Спасибо и наилучшими пожеланиями,
Могу ли я спросить, почему вы предполагаете, что app2 будет иметь доступ к client_secret из app1? Без client_secret app2 ничего не может сделать с кодом авторизации. Я не говорю, что это невозможно, но я не считаю его тривиальным. – anfab
@anfab - я думал о возможности загрузки приложения. бинарно и декомпилировать его или распечатать жестко закодированные строки в приложении. чтобы открыть секрет клиента ... – user967973