Параметры запроса
Ниже описано 2 сценария:
- Аутентификация в мобильном приложении Партнера через приложение Сбербанк Онлайн и через веб Сбер ID (App to App & App to Web).
- Бесшовный переход из мобильного приложения Сбербанк Онлайн в приложение Партнера (App to App SSO).
Получение кода авторизации
- Клиент в приложении Партнера нажимает кнопку входа по Сбер ID.
- Приложение Партнера делает запрос в back-end Партнера для получения параметров аутентификации (
client_id,redirect_url,state,nonce). - Приложение Партнера генерирует параметр
code_verifierи хэширует его методомcode_challenge_method(S256). В результате хэширования получается значениеcode_challenge. - Мобильное приложение Партнера проверяет наличие на устройстве клиента приложения Сбербанк Онлайн. Если оно есть - запрашивает код авторизации через приложение Сбербанк Онлайн (по deeplink), если нет - запрашивает код авторизации путем перенаправления на веб-страницу Сбер ID https://online.sberbank.ru/CSAFront/oidc/authorize.do (get запрос) в отдельном браузере. В запросе указываются параметры
client_id,scope,redirect_url,state,nonce,code_challenge,code_challenge_method. - Клиент в приложении Сбербанк Онлайн/веб-странице Сбер ID подтверждает аутентификацию.
- В результате аутентификации Сбербанк Онлайн/веб-страница Сбер ID перенаправляет клиента в приложение Партнера по адресу, указанному в
redirect_uri. В случае успеха возвращается код авторизации и state, в ином случае - ошибка.
Партнер для вызова аутентификации не должен использовать браузер, встроенный в приложение, который предоставляет приложению доступ к cookie, или содержимому веб-страниц. При открытии веб-страницы Сбер ID в браузере, встроенном в приложение, будет отображена страница-заглушка, сообщающая клиенту о небезопасности входа.
Для сценариев, в которых присутствует риск перехвата AuthCode необходимо испо льзовать защиту PKCE (https://tools.ietf.org/html/rfc7636 ). По рекомендациям RFC 7636 для смягчения атак перехвата кода авторизации используется динамически создаваемое случайное значение - code_verifier. Данное значение должно быть уникальным для каждого запроса кода авторизации. Требования к генерации значения code_verifier(см. также https://tools.ietf.org/html/rfc7636#section-4.1 ):
- Значение
code_verifier- это высокоэнтропийная криптографическая случайная строка; - Строка генерируется с использованием допустимых символов
[AZ] / [az] / [0- 9] / "-" / "." / "_" / "~"; - Минимальная длина - 43 символа;
- Максимальная длина - 128 символов.
Один из возможных алгоритмов:
Партнер, используя подходящий генератор случайных чисел, создает последовательность длиной от 32 до 96 байт, которую затем кодирует способом base64url. Например, для 32-байтной последовательности [116, 24, 223, 180, 151, 153, 224, 37, 79, 250, 96, 125, 216, 173, 187, 186, 22, 212, 37, 77, 105, 214, 191, 240, 91, 88, 5, 88, 83, 132, 141, 121] кодирование base64url в результате даст code_verifier в виде “dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk” (см. https://tools.ietf.org/html/rfc7636#appendix-B ).
Аутентификация в мобильном приложении Партнера через приложение Сбербанк Онлайн и через веб Сбер ID (App to App & App to Web)
Android. Запрос кода авторизации через deeplink
sberbankidlogin://sberbankid?client_id={client_id}&state={state}&scope={scope}&redirect_uri={redirect_uri}&code_challenge_method={S256}
Описание полей запроса смотри в таблице Описание полей запроса кода авторизации.
На экран авторизации в приложении Партнера необходимо добавить кнопку Войти через Сбер ID, при нажатии на которую инициируется запрос кода авторизации.
Получение кода авторизации
- Добавить ключи параметров в ваше приложение:
Форм ирование параметров запроса:
//Название ключей, для параметров запроса
private static final String CLIENT_ID = "client_id";
private static final String STATE = "state";
private static final String NONCE = "nonce";
private static final String SCOPE = "scope";
private static final String BROWSER = "package";
private static final String REDIRECT_URI = "redirect_uri";
private static final String CODE_CHALLENGE = "code_challenge";
private static final String CODE_CHALLENGE_METHOD = "code_challenge_method";
- Создать Uri с параметрами из п.1.
Пример
//Создание Uri с параметрам
Uri uri = new Uri.Builder()
.scheme(SCHEME_MP)
.authority(HOST_MP)
.appendQueryParameter(CLIENT_ID, clientID)
.appendQueryParameter(STATE, state)
.appendQueryParameter(NONCE, nonce)
.appendQueryParameter(SCOPE, scope)
.appendQueryParameter(REDIRECT_URI, redirectUri)
.appendQueryParameter(CODE_CHALLENGE, codeChallenge)
.appendQueryParameter(CODE_CHALLENGE_METHOD, codeChallengeMethod)
.build();
- Проверить установлено ли приложение Сбербанк Онлайн
Пример
//Проверка, что приложение Сбербанк онлайн установлено на телефоне
private boolean isSberbankDeeplinkCanBeHandle(Context context) {
Uri testSberbankDeeplink = new Uri.Builder()
.scheme(SCHEME_MP)
.authority(HOST_MP)
.build();
Intent testSberbankIntent = new Intent(Intent.ACTION_VIEW, testSberbankDeeplink);
return testSberbankIntent.resolveActivity(context.getPackageManager()) != null;
}
- Запросить код авторизации:
- если приложение Сбербанк Онлайн установлено, то его необходимо запустить для запроса кода авторизации
Пример
//Запуск приложения Сбербанк Онлайн
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
- если не установлено, то необходимо запросить код авторизации путем перенаправления на веб-страницу Сбер ID https://online.sberbank.ru/CSAFront/oidc/authorize.do (get запрос) в отдельном браузере (подробнее можно узнать в разделе Параметры запроса).
Пример:
//Замените хост и схему, чтобы использовать web версию для аутентификации
if (checkSbolIsNotInstalled(context)) {
uri.buildUpon()
.scheme("https")
.authority("online.sberbank.ru")
.appendEncodedPath("CSAFront/oidc/authorize.do")
.appendQueryParameter("response_type", "code")
.build();
}
- В результате аутентификации вернется deeplink, указанный в redirect_uri. Чтобы обработать диплинк, укажите в
AndroidManifest.xml
Пример
<activity
android:name="com.example.MainActivity"
android:theme="@style/AppTheme.NoActionBar">
<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_host"
android:scheme="app" />
</intent-filter>
</activity>
Host и scheme должны соответствовать redirect_uri.
Пример обратного deeplink
Положительный результат:
app://apphost?state=Jt2dvD9a9tmZ&code=0BC4A121-F75F-8A3B-BE7E-8C2412209B17
Негативный результат:
app://apphost?result=FAILURE&error_code=5&error={error}