ym88659208ym87991671
Запуск авторизации по Сбер ID | Документация для разработчиков

Запуск авторизации по Сбер ID

Обновлено 12 марта 2024

Стандартный запуск авторизации

Класс SberIDLoginManager содержит все методы для работы с авторизацией по Сбер ID.

для корректной работы необходимо обеспечить, чтобы экземпляр созданного класса SberIDLoginManager создавался и переживал весь цикл авторизации по Сбер ID (запрос на авторизацию и проверка результата). Будьте внимательны при работе с вашим DI, в противном случае при проверке результате вы будете получать ошибку "invalid_state"

Для запуска аутентификации используйте метод loginWithSberbankID.

Класс SberIDLoginManager содержит статический билдер для удобного создания uri для авторизации по Сбер ID, он позволяет минимизировать ошибки ввода значения в неверный параметр. Класс PkceUtils  содержит утилиты для создания значений параметров протокола PKCE (необязательные параметры, если вы не используете PKCE).

// указано для примера, инстанцирование класса SberIDLoginManager выполняйте, как удобно, с обеспечением требования, указанного выше
private val sberIDLoginManager = SberIDLoginManager()

//Создание параметров для поддержки протокола PKCE.
val codeVerifier = PkceUtils.generateRandomCodeVerifier(SecureRandom())
val codeChallenge = PkceUtils.deriveCodeVerifierChallenge(codeVerifier)


//Создание Uri с параметрами для аутентификации, все значения нужно поменять на свои, тут указаны примеры
val uri = SberIDLoginManager
.sberIDBuilder()
.clientID("512e1152-e14c-5223-a125-d519eb68bb86")
.scope("openid name email mobile birthdate gender") //Полный перечень параметров scope доступен в разделе "Перечень допустимых параметров Scope"
.state("ffad1d59c1e34844a1415226103d44f3")
.nonce("b1947d4f10a24eb0a21155239be9b066")
.redirectUri("app://merchant_app/")
.loginHint("79998887766") // Необязательный параметр для передачи номера телефона пользователя, добавлен в версии 2.4.2
.codeChallenge(codeChallenge) //Необязательный параметр
.codeChallengeMethod(PkceUtils.getCodeChallengeMethod()) //Необязательный параметр
.build()


//Запуск аутентификации по SberbankID, первым параметром нужно передать контекст
sberIDLoginManager.loginWithSberbankID(this, uri)

Необходимо направить запрос на support@ecom.sberbank.ru на добавление deeplink в список доверенных. В запросе указывается client_id и список deeplink, по которым будет производиться возврат в мобильное приложение партнера. Сотрудник банка добавит домен в список разрешенных.

Полный перечень параметров scope доступен в разделе Перечень допустимых параметров Scope

Обработка ответа после авторизации

После выполнения авторизации по Сбер ID в обратном интенте придет deeplink, содержащий результаты авторизации.

В манифесте вашего приложения для активити, которая будет обрабатывать результат авторизации по Сбер ID, необходимо указать схему и хост обратного deeplink (они должны совпадать с redirectURI, который вы присылаете к нам). Если хотите обрабатывать обратный deeplink в той же активити, в которой и стартовали аутентификацию, необходимо указать в атрибуте launchMode для вашей активити значение "singleTop" и получать интент с результатом в методе onNewIntent(intent: Intent).

Примеры обработки deeplink:

<activity android:name=".MainActivity"
//для обработки диплинка в той же активити
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="merchant_app"
android:scheme="app" />
</intent-filter>
</activity>

Для проверки результата передать полученный intent в метод SberIDLoginManager#getSberIDAuthResult(intent), который его обработает ответ и вернет сущность SberIDResultModel.

В большинстве случаев вам будет нужен nonce и authCode, они приходят в при успешной авторизации и вы их должны передать в свой бэк для дальнейшей аутентификации вместе с codeVerifier (если используете), созданным ранее.

Также будет передан параметр state, который был получен от сервера авторизации. Проверка на соответствие изначально переданному в запросе от партнера параметру state выполняется на стороне SDK, см. раздел Описание ошибок.

/**
* Сущность ответа от SberID
* @property isSuccess true если ответ положительный и вход произведен удачно.
* @property nonce Значение, сгенерированное внешней АС для предотвращения атак
* повторения.
* @property state Значение, сгенерированное внешней АС для предотвращения CSRF атак.
* @property authCode Код авторизации клиента.
* @property errorDescription Текст ошибки, не показывайте клиентам, они только для разработчиков.
* Типы ошибок:
* - invalid_request: В запросе отсутствуют обязательные атрибуты;
*
* - unauthorized_client: АС-источник запроса не зарегистрирована в
* банке, АС-источник запроса заблокирована в банке, или значение
* атрибута client_id не соответствует формату;
*
* - unsupported_response_type: Значение атрибута response_type не равно
* «code»;
*
* - invalid_scope: Значение атрибута scope не содержит параметр openid в
* начальной позиции или запрошенный scope содержит значения, недоступные
* для АС-источника запроса
* @property errorCode Приходит только в случае ошибки 5, когда вы неверно передали паоаметры,
* ошибки описаны выше. В случае неожиданной ошибки, такие как падения
* приложения и тп.
*/
data class SberIDResultModel @JvmOverloads constructor(
var isSuccess: Boolean? = null,
var state: String? = null,
var nonce: String? = null,
var authCode: String? = null,
var errorDescription: String? = null,
var errorCode: String? = null
)

Пример обработки в том же окне:

//В методе onNewIntent, если примеить для активити android:launchMode="singleTop"
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
val result = sberIDLoginManager.getSberIDAuthResult(intent)
}

При обработки в отдельном окне можно перехватить в методе onCreate(savedInstanceState: Bundle?)

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val result = sberIDLoginManager.getSberIDAuthResult(intent)
}

Поддержка бесшовной авторизации

Начиная с версии SDK 1.3.5 реализована поддержка бесшовной авторизации по Сбер ID, когда после перехода из приложений СберБанка в ваше приложение необходимо автоматически запустить авторизацию без показа кнопки и необходимости пользователю выполнять лишнее действие по нажатию на нее.

В диплинке, который придет в ваше приложение, помимо параметров, которые вы заложите в него самостоятельно по вашим требованиям, будет приходить дополнительный параметр, содержащий строку со схемой и хостом, которую нужно будет передать в билдер диплинка авторизации по Сбер ID (см. раздел Запуск авторизации по Сбер ID).

Для стандартной (не бесшовной) авторизации по Сбер ID по кнопке выполнять указанные в этом пункте действия не требуется.

Чтобы получить значение этого параметра, необходимо воспользоваться следующим методом в классе SberIDLoginManager, передав в него исходный uri, полученный при перехода в ваше приложение в сценарии бесшовной авторизации (uri находится в getIntent().getData()).

/**
* Получить схему диплинка в формате app://host для авторизации по Сбер ID
* из исходного Uri при переходе в МП партнера в сценарии бесшовной авторизаии
* Полученное значение необходимо передать в метод [SberIDBuilder.uriScheme] при построении диплинка на авторизацию
*
* @param uri исходный Uri при переходе в МП партнера при бесшовной авторизации
*/
fun getSeamlessUriScheme(uri: Uri): String?

Полученное значение необходимо передать в следующий метод билдера SberIDLoginBuilder при построении диплинка авторизации.

/**
* Кастомная схема диплинка авторизации по Сбер ID в формате app://host,
* используется к примеру при бесшовной авторизации по Сбер ID
* Для стандартной авторизации по кнопке не требуется
*
* @param uriScheme схема диплинка авторизации по Сбер ID в формате app://host
*/
fun uriScheme(uriScheme: String?): SberIDBuilder

Все дальнейшие действия по подготовке диплинка и старте авторизации аналогичны описанным в разделе Запуск авторизации по Сбер ID.

Запуск авторизации Сбер ID в CustomTabs

Начиная с версии SDK 1.4.0, была добавлена поддержка запуска авторизации по Сбер ID через веб-страницу oidc, которая открывается в CustomTabs. Теперь, если приложение СберБанк Онлайн не установлено на устройстве, веб-страница авторизации откроется в CustomTabs, а не во внешнем браузере, как это было раньше. Это позволяет реализовать еще более бесшовный сценарий для клиента без редиректов в отдельное приложение.

Для этого в вашем проекте должна быть добавлена зависимость на библиотеку браузера AndroidX (если вы подключаете aar файлом).

Для этого в вашем build.gradle пропишите ее в разделе зависимости, если ее еще нет (версия указана на момент публикации, можно использовать более актуальные):

dependencies {
implementation "androidx.browser:browser:1.3.0"
}

Сбер ID через единое веб окно авторизации

В версии SDK 1.4.0 была добавлен новый метод для авторизации пользователя по Сбер ID, используя единое веб окно авторизации. Данный метод предназначен для партнеров, которым необходимо по той или иной причине производить авторизацию только через веб.

Для этого нужно чтобы была подключена зависимость на библиотеку androidx.browser и версия sdk от 1.4.0. Не используйте этот способ, если вам нужен обычный вход через Сбер ID.

Как это работает:

Создайте Uri, как при обычном входе с дополнительным параметром customTabRedirectUri. Для этого в SberIDLoginManager.sberIDBuilder() появился новый метод customTabRedirectUri(customTabRedirectUri: String, context: Context): SberIDBuilder:

val uri = SberIDLoginManager
.sberIDBuilder()
.clientID("512e1152-e14c-5223-a125-d519eb68bb86")
.scope("openid name email mobile birthdate gender")
.state("ffad1d59c1e34844a1415226103d44f3")
.nonce("b1947d4f10a24eb0a21155239be9b066")
.redirectUri("app://merchant_app/")
.customTabRedirectUri("app://redirect_app/", this)
.codeChallenge(codeChallenge) //Необязательный параметр
.codeChallengeMethod(PkceUtils.getCodeChallengeMethod()) //Необязательный параметр
.build()

Запустите авторизацию, используя функцию loginWithSberIDToCustomTabs(context: Context, uri: Uri): Boolean, класса SberIDLoginManager. Если запуск сценария невозможен, вернется false, данное поведение возможно, если не были подключены все необходимые зависимости, нет подходящих браузеров на устройстве или ссылка была собрана некорректно.

Если все сделано верно, вы увидите окно с различными способами идентификации входа по Сбер ID: 

Скриншот входа

Новый параметр СustomTabRedirectUri используется для возврата в ваше приложение в сценариях: "Вход по номеру телефона""Войти через Сбербанк Онлайн" и других. Она запускает заглушечную activity, которая открывается поверх окна с CustomTabs и сразу закрывается. Тем самым происходит возврат на то самое веб окно с CustomTabs, с которого начиналась авторизация в вебе. В SDK идет готовая заглушечная activity ReturnToCustomTabsSberIDActivity, чтобы использовать ее добавьте activity в вашем AndroidManifest.xml:

 <activity
android:name="sberid.sdk.auth.view.activity.ReturnToCustomTabsSberIDActivity"
android:screenOrientation="portrait"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />

<data
android:host="redirect_app"
android:scheme="app" />
</intent-filter>
</activity>

android:host и android:scheme соответсвуют customTabRedirectUri из предыдущих шагов. Регистрация на стороне банка customTabRedirectUri аналогичная той, что используется для redirectUri. android:launchMode="singleTask" позволяет вернуться в ваше приложение вне задачи мобильного приложения СберБанк Онлайн.

Окно с CustomTabs после восстановления продолжит свою работу и в результате, как и раньше, после авторизации пользователя, по диплинку из переданного изначально redirectUri, произойдет редирект на нужный экран вашего приложения.

Смотрите пункт Запуск авторизации по Сбер ID.

Перечень допустимых параметров Scope

Для получения данных пользователя необходимо на этапе инициализации SberIDLoginManager передать перечень необходимых данных в параметре scope. Ниже в таблице представлен список всех доступных scope для Сбер ID:

ScopeНаименование параметра в ответеОписаниеПример ответа
namefamily_name, given_name, middle_nameФамилия, Имя, Отчество

"family_name":"Фамилия"

"given_name":"Имя"

"middle_name":"Отчество"

birthdatebirthdateДата рождения (формат ГГГГ-ММ-ДД) "birthdate":"0000-00-00"
maindocidentificationПолные данные паспорта:

"identification":{

"series":"00 00",

"number":"000000",

"issued_by":"Орган выдавший документ",

"issued_date":"0000-00-00",

"code":"000-000"

}

inninnИНН номер

"inn":{

"number":"0000000"

}

snilssnilsСНИЛС номер

"snils":{

"number":"0000000"

}

mobilephone_numberНомер телефона"phone_number":"+7 (000) 000000”
emailemailАдрес электронной почты"email":“personal@mail.ru
gendergenderПол: 1 – мужчина; 2 – женщина;"gender":1,
driving_licensedriving_licenseНомер водительского удостоверения

"driving_license":{

"number":"111111"

}

international_passportinternational_passportЗаграничный паспорт гражданина РФ:

"international_passport":{

"series":"777",

"number":"333",

"issued_by":"рога и копыта",

"issued_date":"1981-01-01",

"planned_end_date":"1999-02-01",

"name":"name",

"surname":"surname"

}

priority_docpriority_docДанные документа, удостоверяющего личность:

"priority_doc":{

"type":17,

"series":"777",

"number":"333",

"issued_by":"рога и копыта",

"issued_date":"1981-01-01",

"code":"adasd"

}

citizenshipcitizenshipГражданство:

"citizenship":{

"country_code":"countryCode",

"country_name":"countryName"

}

place_of_birthplace_of_birthМесто рождения"place_of_birth":”Nsk”
address_regaddress_regАдрес регистрации

"address_reg":{

"full_address":"fullAddress",

"fias_code":"fiasCode",

"post_index":"postIndex",

"country":"country",

"region":"region",

"district":"district",

"city":"city",

"settlement":"settlement",

"street":"street",

"house":"house",

"building":"building",

"bulk":"bulk",

"apartment":"apartment"

}

work_addresswork_addressРабочий адрес

"work_address":{

"full_address":"fullAddress",

"fias_code":"fiasCode",

"post_index":"postIndex",

"country":"country",

"region":"region",

"district":"district",

"city":"city",

"settlement":"settlement",

"street":"street",

"house":"house",

"building":"building",

"bulk":"bulk",

"apartment":"apartment"

}

address_of_actual_residenceaddress_of_actual_residenceАдрес места жительства/доставки

"address_of_actual_residence":{

"full_address":"fullAddress",

"fias_code":"fiasCode",

"post_index":"postIndex",

"country":"country",

"region":"region",

"district":"district",

"city":"city",

"settlement":"settlement",

"street":"street",

"house":"house",

"building":"building",

"bulk":"bulk",

"apartment":"apartment"

}

delivery_addressdelivery_addressАдрес для доставки

"delivery_address":{

"full_address":"fullAddress",

"fias_code":"fiasCode",

"post_index":"postIndex",

"country":"country",

"region":"region",

"district":"district",

"city":"city",

"settlement":"settlement",

"street":"street",

"house":"house",

"building":"building",

"bulk":"bulk",

"apartment":"apartment"

}

is_company_employeeis_company_employee Признак сотрудника ПАО "Сбербанк""is_company_employee":true,
stsstsНомер СТС

"sts":{

"number":"00 00 00000"

}

is_self_employedis_self_employedПризнак самозанятого"is_self_employed":true
previous_maindocprevious_identificationРеквизиты ранее выданного паспорта гражданина РФ:

"previous_identification":{

"series":"00 00",

"number":"000 000",

"issued_by":"Орган выдавший документ",

"issued_date":"0000-00-00"

}

previous_nameprevious_family_name,previous_given_name,previous_middle_nameПредыдущая фамилия, имя, отчество

"previous_family_name":"Фамилия"

"previous_given_name":"Имя"

"previous_middle_name":"Отчество"

educationeducationСведения об образовании:

"education":{

"code":"1",

"description":"начальное"

}

place_of_workplace_of_workНаименование организации(место работы)"place_of_work": "место работы",
job_titlejob_titleНаименование должности"job_title": "должность"
marital_statusmarital_statusСемейное положение:

"marital_status":{

"code":"1",

"description":"холост"

}

propositionpropositionСведения для формирования рекламных предложений (признак VIP-клиента)"proposition": true
salary_statussalary_statusПризнак зарплатного клиента"salary_status": true

FAQ

При возникновении вопрос рекомендуем заглянуть в наш раздел FAQ по сценарию OIDC to App

ПАО Сбербанк использует cookie для персонализации сервисов и удобства пользователей.
Вы можете запретить сохранение cookie в настройках своего браузера.