Лучшее решение: единый вход (SSO) с использованием пользовательской схемы URL
Когда я проверял ваш вопрос, я вспомнил приложение Zoom, которое я использую в своем офисе. Как это устроено ?
Моя учетная запись Gmail связана с учетной записью Zoom (это привязка учетной записи, которая выходит за рамки реализации). Когда я открываю приложение Zoom, я могу выбрать опцию входа в Gmail. Это откроет мой браузер и переместит меня в Gmail. Если я вошел в Gmail, меня перенаправили обратно на страницу с просьбой запустить приложение Zoom. Как происходит запуск этого приложения? Приложение регистрирует пользовательскую схему URL , когда приложение устанавливается, и конечный редирект в браузере нацелен на этот URL. И этот URL передает временный секрет, который приложение Zoom использует для получения токенов OAuth. И получение токена осуществляется независимо от браузера, прямой вызов с помощью SSL на конечную точку токена сервера OAuth.
Ну, это поток кода авторизации для нативных приложений. И вот как мобильные приложения используют OAuth. Ваша основная проблема, не позволяющая пользователю повторно войти в систему, решена. Это SSO в действии.
Существует спецификация, которая определяет лучшие практики вокруг этого механизма. Я приглашаю вас пройти через RFC8252 - OAuth 2.0 для собственных приложений .
Вызов
Для каждого дистрибутива приложения необходимо реализовать собственный код для конкретной ОС. Windows, Mac и Linux имеют различную поддержку реализации пользовательской схемы URL.
Обратить
PKCE является обязательным (в словах IETF СЛЕДУЕТ) для всех типов предоставления OAuth. Есть этот текущий проект , в котором говорится об этом. Так что включите PKCE для вашей реализации тоже.
С PKCE ответ перенаправления / обратного вызова защищен от кражи. Даже какое-то другое приложение перехватывает обратный вызов, запрос токена не может быть воссоздан, так как есть PKCE code_verifer.
Кроме того, не используйте нестандартное решение, такое как передача секрета через другой канал. Это усложнит процесс обслуживания. Поскольку этот поток уже существует в OAuth, вы можете воспользоваться библиотеками и руководствами.
-------------------------------------------- ---------
Обновление: запрос защиты токена
В то время как пользовательская схема URL решает проблему запуска собственного приложения, защита запроса токена может быть сложной задачей. Есть несколько вариантов для рассмотрения.
- Связать запуск собственного приложения с секретным ключом из браузера
Когда клиент на основе браузера запускает собственный клиент, он может вызывать пользовательский API для генерации секрета. Этот секрет действует как одноразовый пароль (OTP). Пользователь должен ввести это значение в нативное приложение, прежде чем получить токены. Это настройка поверх потока кода авторизации.
- Динамическая регистрация клиента и Динамическая аутентификация клиента
Внедрение секретов в общедоступные клиенты не рекомендуется в соответствии со спецификацией OAuth. Но, как указывает владелец вопроса, некоторые вредоносные приложения могут зарегистрироваться, чтобы получить пользовательский URL-ответ и получить токены. В этом случае PKCE может обеспечить дополнительный уровень безопасности.
Но все же в крайнем случае, если вредоносное приложение регистрирует URL-адрес и использует PKCE в качестве исходного приложения, возможны потенциальные угрозы.
Один из вариантов - разрешить динамическую регистрацию клиента при первом запуске приложения. Здесь установщик / дистрибутив может содержать секрет, который используется вместе с DCR.
Также возможно использовать динамическую аутентификацию клиента через выделенную службу. Здесь запрос токена приложения содержит временный токен, выпущенный пользовательской службой. Таможенный сервис получить вызов из родного приложения. Это может быть сделано с помощью totp или криптографической привязки на основе встроенного секрета. Также можно использовать OTP (как упомянуто в первом примечании), выданный через браузер, который должен быть скопирован, вставлен вручную конечным пользователем. После проверки эта служба выдает токен, соответствующий секрету. В запросе токена нативный клиент отправляет этот токен вместе со значениями обратного вызова. Таким образом мы уменьшаем векторы угроз, хотя мы увеличиваем реализацию.
Резюме
- Использовать пользовательскую схему URL для запуска собственного приложения
- Приложение-браузер генерирует временный секрет для общего доступа к пользовательской службе
- При запуске собственного приложения пользователь должен скопировать секрет в пользовательский интерфейс собственного приложения
- Собственное приложение обменяет этот секрет с пользовательской службой для получения токена
- Этот второй токен в сочетании с кодом авторизации обратного вызова (выданным по специальной схеме URL) используется для аутентификации в конечной точке токена
- Выше можно рассматривать как динамическую аутентификацию клиента
- Значение, предоставляемое пользователю, может быть хешированным секретом, следовательно, исходное значение никогда не раскрывается конечному пользователю или другому клиенту
- DCR также возможен, но встроенные секреты не приветствуются в мире OAuth