Обработка ответа после авторизации
После авторизации пользователем по Сбер ID будет вызван обратный deeplink
равный redirectUri
, переданного на старте входа.
Данный deeplink
вызовет ваше приложение и будет содержать информацию о входе.
В манифесте вашего приложения для activity, которая будет обрабатывать результат авторизации по Сбер ID, необходимо указать scheme
и host
обратного deeplink
.
Если хотите обрабатывать обратный deeplink в той же activity, в которой и стартовали аутентификацию, необходимо указать в атрибуте launchMode для вашей активити значение "singleTop" и получать интент с результатом в методе onNewIntent(intent: Intent).
Примеры обработки deeplink:
<activity android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"> //для обработки deeplink в той же activity
<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"
android:scheme="partner" />
</intent-filter>
</activity>
Для проверки результата необходимо передать полученный intent
в метод «SID.Login.getIDAuthResult(intent)», который обработает ответ и вернет сущность SberIDResultModel
.
В этой модели будут содержаться все необходимые данные для аутентификации, включая nonce
и authCode
. Вам нужно передать их на свой бэкенд для дальнейшей аутентификации вместе с codeVerifier
(если используете), созданным на этапе входа.
Описание модель результата SberIDResultModel
/**
* Сущность ответа от 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
)
Пример обработки результата
В той же activity:
//В методе onNewIntent, если применить для activity android:launchMode="singleTop"
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
val result = SID.Login.getIDAuthResult(intent)
if (resultModel.isSuccess == true) {
// Отправьте result.authCode, resultModel.state, resultModel.nonce на свой бэк для окончания авторизации
} else {
// Ошибка, отобразите пользователю, что вход не получился
}
}
При обработки в новой activity можно перехватить в onCreate(savedInstanceState: Bundle?):
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val result = SID.Login.getIDAuthResult(intent)
if (resultModel.isSuccess == true) {
// Отправьте result.authCode, resultModel.state, resultModel.nonce на свой бэк для окончания авторизации
} else {
// Ошибка, отобразите пользователю, что вход не получился
}
}