Я пытаюсь реализовать делегированную авторизацию в веб-API для мобильных приложений с использованием OAuth 2.0. Согласно спецификации, неявный поток предоставления не поддерживает токены обновления, что означает, что после предоставления токена доступа на определенный период времени пользователь должен снова предоставить разрешения приложению после истечения срока действия токена или его отзыва.
Я думаю, это хороший сценарий для некоторого кода javascript, работающего в браузере, как это упоминается в спецификации. Я пытаюсь свести к минимуму время, в течение которого пользователь должен предоставлять разрешения приложению для получения токена, поэтому похоже, что поток кода авторизации является хорошим вариантом, поскольку он поддерживает токены обновления.
Однако этот поток, похоже, сильно зависит от веб-браузера для выполнения перенаправлений. Мне интересно, подходит ли этот поток для мобильного приложения, если используется встроенный веб-браузер. Или мне следует использовать неявный поток?
Ответы:
Уточнение: мобильное приложение = собственное приложение
Как указано в других комментариях и нескольких источниках в Интернете, неявный вид кажется естественным подходом для мобильных приложений, однако лучшее решение не всегда однозначно (и на самом деле неявный не рекомендуется по причинам, обсуждаемым ниже).
Рекомендации по OAuth2 для собственных приложений
Какой бы подход вы ни выбрали (есть несколько компромиссов, которые следует учитывать), вам следует обратить внимание на передовые практики, изложенные здесь для собственных приложений с использованием OAuth2: https://tools.ietf.org/html/rfc8252
Рассмотрим следующие варианты
Неявный
Следует ли использовать неявный?
Цитата из раздела 8.2 https://tools.ietf.org/html/rfc8252#section-8.2
Код авторизации
Если вы используете код авторизации, то одним из подходов будет прокси-сервер через ваш собственный компонент веб-сервера, который обогащает запросы токенов секретом клиента, чтобы избежать его хранения в распределенном приложении на устройствах.
Выдержка из: https://dev.fitbit.com/docs/oauth2/
Вывод
Окончательное решение должно учитывать ваш желаемый пользовательский опыт, а также ваш аппетит к риску после проведения надлежащей оценки рисков ваших включенных в короткий список подходов и лучшего понимания последствий.
Отличное чтение здесь 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/ указывает, что вам следует
Рассмотрение веб-просмотров
Существует множество примеров использования веб-представлений, то есть встроенного пользовательского агента, но этого подхода следует избегать (особенно, когда приложение не является основным), и в некоторых случаях может привести к тому, что вам запретят использовать API в качестве выдержки. ниже отсюда демонстрирует
Для дальнейшего пояснения, вот цитата из этого раздела предыдущего проекта ссылки на передовой опыт, представленной выше.
Здесь также поднимаются некоторые интересные моменты: /security/179756/why-are-developers-using-embedded-user-agents-for-3rd-party-auth-what-are-the- а
источник
К сожалению, я не думаю, что на этот вопрос есть однозначный ответ. Однако вот варианты, которые я определил:
Если можно запросить у пользователя его / ее учетные данные, используйте учетные данные пароля владельца ресурса . Однако это может быть невозможно по некоторым причинам, а именно:
Если требуется использование потока на основе браузера, используйте кода авторизации . Здесь определение термина
redirect_uri
является серьезной проблемой, для которой существуют следующие варианты:redirect_uri
(напримерurn:ietf:wg:oauth:2.0:oob
) сигнализирует конечной точке авторизации, чтобы показать код авторизации вместо перенаправления обратно в клиентское приложение. Пользователь может вручную скопировать этот код или приложение может попытаться получить его из заголовка HTML-документа.localhost
сервер на устройстве (управление портом может оказаться непростым).myapp://...
), которая при разыменовании запускает зарегистрированный «обработчик» (детали зависят от мобильной платформы).Надеюсь это поможет
Педро
источник
TL; DR: использование предоставления кода авторизации с PKCE
1. Неявный тип гранта
Неявный тип гранта довольно популярен в мобильных приложениях. Но это не предназначалось для такого использования. Перенаправление связано с проблемами безопасности. Джастин Ричер заявляет :
И вместе с тем, что он не позволяет обновить токен доступа, лучше этого избегать.
2. Тип предоставления кода авторизации
Для предоставления кода авторизации требуется секрет клиента. Но не следует хранить конфиденциальную информацию в исходном коде мобильного приложения. Люди могут их извлечь. Чтобы не раскрывать секрет клиента, вам нужно запустить сервер в качестве посредника, как пишет Facebook :
Не идеальное решение, но есть новый, лучший способ использовать OAuth на мобильных устройствах: Proof Key for Code Exchange
3. Тип предоставления кода авторизации с PKCE (ключ подтверждения для обмена кодом)
Из-за ограничений был создан новый метод, позволяющий использовать код авторизации без секрета клиента. Вы можете прочитать полный RFC 7636 или это краткое введение .
с https://oauth.net/2/pkce/
источник
Использование веб-просмотра в вашем мобильном приложении должно быть доступным способом реализации протокола OAuth2.0 на платформе Android.
Что касается поля redirect_uri, я считаю, что
http://localhost
это хороший выбор, и вам не нужно переносить HTTP-сервер внутри вашего приложения, потому что вы можете переопределить реализациюonPageStarted
функции вWebViewClient
классе и прекратить загрузку веб-страницыhttp://localhost
после проверкиurl
параметра.источник
Самый удобный и простой в реализации пользовательский интерфейс для аутентификации - это встроить веб-просмотр в ваше приложение. Обработайте ответы, полученные веб-просмотром от точки аутентификации, и обнаружите ошибку (отмена пользователя) или утверждение (и извлеките токен из параметров запроса URL). И я думаю, что вы действительно можете сделать это на всех платформах. Я успешно выполнил эту работу для следующих устройств: ios, android, mac, приложения Windows Store 8.1, приложения Windows Phone 8.1. Я сделал это для следующих сервисов: dropbox, google drive, onedrive, box, basecamp. Для платформ, отличных от Windows, я использовал Xamarin, который якобы не раскрывает все API-интерфейсы, специфичные для платформы, но при этом предоставляет достаточно, чтобы это стало возможным. Так что это довольно доступное решение даже с точки зрения кроссплатформенности, и вы не
источник