Ошибка аутентификации в приложении партнера через OIDC страницу
При реализации Аутентификация через OIDC страницу по документации для Android и IOS и используя SDK версии 2.0.0 и ниже, возможна ошибка завершения сценария.
Кейс
- Пользователь в мобильном приложении партнера нажимает войти по Сбер ID
- Открывается OIDC страница во встроенном в приложение браузере
- Пользователь выбирает вход через приложение СБОЛ
- В СБОЛе пользователь успешно подтвержает вход
- Пользователя перебрасывает во внешний браузер смартфона
- Аутентификация провалена
Причина
Сценарий входа через МП СБОЛ на OIDC странице начинается во встроенном в приложение браузере (Chrome Custom Tab или Safari View Controller), но после редиректа пользователя направляет во внешний браузер т.е. сценариций заканчивается в другом браузере или сценарий был запущен в браузере в режиме инкогнито.
Рекомендация
Вариант 1. Если используете SDK
После обновления Android SDK и IOS SDK до версии 2.2 и выше. Требуемые парметры authApp
и app_redirect_uri
будут передаваться автоматически, решив возникшую проблему.
Вариант 2. Если интегрированы по API
Перед запуском инициализации OIDC страницы необходимо проверить наличие мобильного приложения СБОЛ на устройстве или его отсутсвие
Android
// Проверка что МП СБОЛ не установлен на устройстве
fun checkSbolIsNotInstalled(context: Context): Boolean{
val deeplinkUri = Uri.Builder()
.scheme("sberbankidlogin")
.authority("sberbankid").build()
return context.packageManager
.queryIntentActivities(Intent( Intent.ACTION_VIEW, deeplinkUri), 0)
.isEmpty()
}
IOS
//Проверка что приложение сможет запустить диплинк и есть приложение которое сможет открыть этот диплинк.
private func isSBOLExists() -> Bool {
guard let sberbankOnlineDeeplink = URL(string: SdkConstants.sberbankOnlineOidcDeeplink),
let sbolDeeplink = URL(string: SdkConstants.sbolOidcDeeplink)
else {
return false
}
return urlOpenner.canOpenUrl(sbolDeeplink) || urlOpenner.canOpenUrl(sberbankOnlineDeeplink)
}
func canOpenUrl( _url:URL)-> Bool {
return UIApplication.shared.canOpenURL(url)
}
В результате проверки если МП СБОЛ установлено, то при запросе кода авторизации добавить передачу параметров authApp=sbol
и app_redirect_uri
={диплинк для возврата в ваше приложение после подтверждения в МП СБОЛ}
Если на устройстве нет МП СБОЛ, то в параметр authApp
передать none
Вариант 3. Если нужно скрыть вход через МП СБОЛ
Если рекомендации выше вам не подходят, можно скрыть вход через МП СБОЛ на OIDC странице, для этого при запросе кода авторизации
в параметр app
передавать значение false
Пример
https://online.sberbank.ru/CSAFront/oidc/authorize.do?
response_type=code
&client_type=PRIVATE
&scope=openid name
&client_id=DA5278AC-A07F-C01A-B2D3-C231DBB2E20F
&state=af0ifjsldkj
&nonce=n-0S6_WzA2Mj
&redirect_uri=https%3A%2F%2Fclientresource.ru%2Fcb
&app=false