Бесшовный переход из вашего приложения на сайт партнера
Сбер ID SDK позволяет обеспечить бесшовный переход пользователей между вашим мобильным приложением и сайтом партнера. Пользователи могут легко переключаться между сервисами, сохраняя статус аутентификации.
Получение AppToken
AppToken — это специальный токен, необходимый для авторизации пользователя. Для его получения добавьте в запрос на авторизацию дополнительный параметр mapp_sso.
val uri = SID.Login.createUriForLogin(
clientId = "clientId вашего сервиса", // на данный момент необходимо дублировать параметр
scope = "openid mapp_sso", // добавьте все необходимые вам scope
state = "random_state",
nonce = "random_nonce",
redirectUrl= "partner://redirect",
codeChallenge: "code_challenge",
codeChallengeMethod: PkceUtils.getCodeChallengeMethod()
)
Для сохранения необходимо вызвать метод SID.Login.getIDAuthResult(intent: Intent)
для проверки результата авторизации.
Без данного метода appToken не сохранится.
val resultModel = SID.Login.getIDAuthResult(intent)
После успешной авторизации, мы сохраним токен в защищенном хранилище и он будет валиден около трех месяцев. По умолчанию токен обновляется каждый день. Если вам нужно изменить частоту обновления токена, пожалуйста, свяжитесь с нашей службой поддержки.
Проверка AppToken на валидность
Проверку AppToken на валидность следует выполнять при каждом запуске вашего приложения, после инициализации SDK Сбер ID.
//Подпишитесь на получение событий.
SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.HasExpire -> {
//Необходимо обновить токен
}
AppTokenEvents.IsValid -> {
// Токен валиден
}
...
}
}
//Старт проверки токена на проверку
SID.AppToken.checkAppTokenForValid()
Стоит отметить, что методы, работающие с AppToken, используют общую шину SID.AppToken.subscribeToEvents(this) для всех ответов. Это означает, что вам достаточно подписаться на события один раз, и вы сможете обрабатывать все запросы, связанные с AppToken, в одном месте. Такой подход позволяет упростить и централизовать обработку событий, связанных с AppToken, что делает код более чистым и поддерживаемым.
Во всех последующих примерах будут указаны только необходимые AppTokenEvents
для соответствующих шагов. Полное описание можно найти в конце статьи.
Обновление AppToken
При провале проверки на валидность токена, обновите его. Новый токен будет автоматичски перезаписан в случае успешного запроса.
SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.HasExpire -> {
updateAppToken() // Запускаем обновление
}
...
}
private fun updateAppToken() {
val codeVerifide = PkceUtils.generateRandomCodeVerifier(SecureRandom())
val codeChallenge = PkceUtils.deriveCodeVerifierChallenge(codeVerifide)
val oidcParams = OIDCParams(
clientId = "clientId вашего сервиса", // на данный момент необходимо дублировать параметр
scope = "openid mapp_sso", //+добавьте все необходимые вам scope
redirectUrl = "partner://redirect",
state = "random_state",
nonce = "random_nonce",
codeChallenge = codeChallenge,
codeChallengeMethod = PkceUtils.getCodeChallengeMethod()
)
SID.AppToken.updateAppToken(oidcParams)
}
Переход на сайт партнера
Для перехода используйте метод goToPartnerSSO
с необходимыми параметрами:
- webLink — Ссылка на сайт партнера;
- clientId — Уникальный идентификор партнера, использующего Сбер ID;
- partnerColorInt? — Предпочтительный цвет для лоадера и окраса UI элементов;
- openIn — Тип контроллера для открытия страницы партнера
SIDOpenInType.webview
илиSIDOpenInType.browser
.
val activity = requireActivity()
val color: Int? = kotlin.runCatching {
Color.parseColor(appTokenColor?.text.toString())
}.getOrNull()
val info = LinkInformation(
webLink = "https://partner.ru/sso_auth",
clientId = "сlientId партнера",
partnerColorInt = color ?: Color.GREEN,
openIn = OpenInConstants.WEB_VIEW / OpenInConstants.BROWSER,
)
SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
...
AppTokenEvents.Success -> Unit //Удачный переход на партнера
...
}
}
SID.AppToken.goToPartnerSSO(currentActivity = activity, linkInformation = info)
Удаление AppToken
При выходе пользователя из системы не забудьте удалить AppToken.
SID.Login.logout()
События и их обработка
Все события при работе с AppToken обрабатываются в одном месте, необходимо подписаться на событие SID.AppToken.subscribeToEvents(this) и обработать получившийся tokenEvents.
SID.AppToken.subscribeToEvents(this) { tokenEvents ->
when(tokenEvents){
AppTokenEvents.HasExpire -> {
//Необходимо обновить токен
}
AppTokenEvents.IsValid -> {
// Отлично, все валидно!
}
AppTokenEvents.RequiredRelogin -> {
// Разлогинить пользователя или продолжить работу с частичным функционалом
}
AppTokenEvents.Success -> Unit
AppTokenEvents.ServiceError -> Unit
AppTokenEvents.ServiceNotAvailable -> Unit
AppTokenEvents.LinkIsNotValid -> Unit
}
}
Тип ошибки | Значение | Обработка |
---|---|---|
HasExpire | Токен невалиден, срок годности истекает или уже вышел | Обновить токен SID.AppToken.updateAppToken |
IsValid | Токен валиден | Продолжить работу приложения в обычном режиме |
RequiredRelogin | Часть функционала ограничена, для снятия ограничений - рекомендуется перелогинить пользователя | Разлогинить пользователя или продолжить работу с частичным функционалом |
Success | Токен обновлен или вход на партнера успешен | При желании тут можно добавить бизнес логику, событие не является обязательным |
ServiceError | Ошибка работы сервера | Продолжить работу приложения в обычном режиме |
ServiceNotAvailable | Сервис временно не доступен | Продолжить работу приложения в обычном режиме |
LinkIsNotValid | Невалидная ссылка на партнера webLink , ошибка для отладки функционала | Проверьте что ссылка валидна и может открыться в браузере |