Аутентификация на веб-странице партнера через мобильное приложение Сбербанк Онлайн (mWeb to App)
Протокол взаимодействия поддерживает функционал универсальных ссылок. Если на устройстве пользователя установлено мобильное приложение Сбербанк Онлайн, то операционная система направит запрос авторизации в мобильное приложение, иначе страница аутентификации откроется во внешнем браузере.
Для поддержки сценария партнеру нужно:
- встроить скрипт, формирующий универсальную ссылку;
- реализовать экран ошибки входа при несовпадении параметра state.
Для минимизации риска перехвата AuthCode в данном сценарии рекомендуется использовать метод защиты PKCE.
При вызове универсальной ссылки из браузера сценарий входа по Сбер ID через мобильное приложение в некоторых случаях может завершиться ошибкой - параметр state запросе и ответе не будут совпадать, т.к. сценарий начался и закончился в разных браузерах или нет возможности сохранить state локально (пример: приватный режим браузера; in-app браузер; все браузеры на iOS, кроме Safari).
Скрипт Сбер ID формирует универсальную ссылку в зависимости от браузера и режима просмотра с целью минимизации ошибочных сценариев описанных выше.
При обратном редиректе из мобильного приложения Сбербанк Онлайн (по redirect_uri
) в браузере открывается новая вкладка. Для корректного продолжения сценария пользователя на сайте партнера следует сохранять контекст сессии (например, в cookie) при нажатии кнопки «Войти по Сбер ID» и восстанавливать его при обратном редиректе.
Скрипт можно найти в SberID JS SDK
.
Пример встраивания скрипта:
<body>
<div class="navigator"></div>
<div class="result">
<a
href="https://online.sberbank.ru/CSAFront/oidc/authorize.do?response_type=code&scope=openid gender snils&client_id=AAAABBBB-XXXX-YYYY-ZZZZ-A12A618A4C3C&state=7bQfJTePBhlW&nonce=w9H8bh2yN4mQ&redirect_uri=https://example.com/external_login"
>Войти по Сбер ID</a
>
</div>
<!-- Начало скрипта -->
<script src="dist/sberid-deeplink.min.js"></script>
<script>
(function () {
function mySberidUniversallink(result) {
console.log(result);
/*{
"isPrivate": true,
"isUniversalLink": false,
"os": "windows",
"browser": "chrome",
"link": "https://online.sberbank.ru/CSAFront/oidc/authorize.do?response_type=code&scope=openid gender snils&client_id=AAAABBBB-XXXX-YYYY-ZZZZ-4C3C&state=7bQfJTePBhlW&nonce=w9H8bh2yN4mQ&redirect_uri=https://example.com/external_login",
"deeplink": "sberbankidlogin://sberbankid/sso?response_type=code&scope=openid gender snils&client_id=AAAABBBB-XXXX-YYYY-ZZZZ-4C3C&state=7bQfJTePBhlW&nonce=w9H8bh2yN4mQ&redirect_uri=https://example.com/external_login",
"universalLinkUrl: "https://online.sberbank.ru/CSAFront/oidc/sberbank_id/authorize.do",
"defaultLinkUrl": "https://online.sberbank.ru/CSAFront/oidc/authorize.do",
"deeplinkUrl": "sberbankidlogin://sberbankid/sso",
oidc: {
response_type: "code",
client_type: "PRIVATE",
client_id: "AAAABBBB-XXXX-YYYY-ZZZZ-A12A618A4C3C",
state: "7bQfJTePBhlW",
redirect_uri: "https://example.com/external_login",
scope: "openid gender snils",
nonce: "w9H8bh2yN4mQ",
display: "popup",
ext_redirect_uri: "googlechrome://example.com/external_login"
}
}*/
}
try {
var sberidUniversallink = new SberidUniversallink({
params:
'response_type=code&scope=openid gender snils&client_id=AAAABBBB-XXXX-YYYY-ZZZZ-4C3C&state=7bQfJTePBhlW&nonce=w9H8bh2yN4mQ&redirect_uri=https://example.com/external_login',
callback: mySberidUniversallink,
});
} catch (error) {
console.log(error);
}
})();
</script>
<!-- Конец скрипта -->
</body>
В результате выполнения скрипта:
- Обычная ссылка заменяется на универсальную в элементах, указанных в параметре
selector
, подставляется универсальная ссылка, сформированная из параметров params - В функцию обратного вызова передаются данные, позволяющие сформировать универсальную ссылку самостоятельно
Параметры SberidUniversallink
Название параметра | Обязательный | Описание |
---|---|---|
params | Нет | Параметры запроса кода авторизации |
selector | Нет | HTML-элемент (id, стиль или вид), в котором нужно заменить ссылку запроса кода авторизации |
callback | Нет | Функция обратного вызова, в которой партнер может реализовать свою логику формирования универсальной ссылки. Актуально, если партнер формирует ссылку на сервере |
Примеры значений параметров SberidUniversallink
{
"params": "response_type=code&scope=openid gender snils&client_id=AAAABBBB-XXXX-YYYY-ZZZZ-4C3C&state=7bQfJTePBhlW&nonce=w9H8bh2yN4mQ&redirect_uri=https://example.com/external_login",
"selector": "myElement",
"callback": "mySberidUniversallink"
}
Параметры ответа SberidUniversallink
Название параметра | Описание |
---|---|
isPrivate | Параметры запроса кода авторизации |
isUniversalLink | true - из данного браузера можно запускать универсальную ссылку false - универсальную ссылку запускать нельзя, т.к. это может привести к ошибке на стороне партнера |
os | Операционная система |
browser | Браузер |
link | Полная ссылка запроса кода авторизации |
deeplink | Deeplink без параметров (для вызова мобильного приложение Сбербанк Онлайн в сценарии App2Webview) |
universalLinkUrl | Универсальная ссылка без параметров |
defaultLinkUrl | Обычная ссылка без параметров |
deepLinkUrl | Полный deeplink (для вызова мобильного приложения Сбербанк Онлайн в сценарии App2Webview) |
oidc | object . Содержит oidc параметры, переданные в скрипт при вызове |
ext_redirect_uri | Параметр, вложенный в объект oidc. Deeplink для вызова браузера в котором находился клиент при нажатии на кнопку «Войти по Сбер ID» и открытия в нем ссылки, указанной в redirect_uri . Указывается только если `os=ios |
package | Параметр, вложенный в объект oidc.Deeplink для вызова браузера в котором находился клиент при нажатии на кнопку «Войти по Сбер ID» и открытия в нем ссылки, указанной в redirect_uri . Указывается только если `os=android |
Примеры значений параметров ответа SberidUniversallink
{
"isPrivate": "false",
"isUniversalLink": "true",
"os": "ios",
"browser": "safari",
"link": "https://online.sberbank.ru/CSAFront/oidc/sberbank_id/authorize.do?response_type=code&scope=openid gender snils&client_id=AAAABBBB-XXXX-YYYY-ZZZZ-A12A618A4C3C&state=7bQfJTePBhlW&nonce=w9H8bh2yN4mQ&redirect_uri=https://example.com/external_login",
"deeplink": "sberbankidlogin://sberbankid/sso",
"universalLinkUrl": "https://online.sberbank.ru/CSAFront/oidc/sberbank_id/authorize.do",
"defaultLinkUrl": "https://online.sberbank.ru/CSAFront/oidc/authorize.do",
"deepLinkUrl": "sberbankidlogin://sberbankid/sso?response_type=code&scope=openid gender snils&client_id=AAAABBBB-XXXX-YYYY-ZZZZ-4C3C&state=7bQfJTePBhlW&nonce=w9H8bh2yN4mQ&redirect_uri=https://example.com/external_login",
"oidc": [
{
"response_type": "code",
"scope": "openid name maindoc email mobile",
"client_id": "DA5278AC-A07F-C01A-B2D3-C231DBB2E20F",
"state": "af0ifjsldkj",
"nonce": "n-0S6_WzA2Mj",
"redirect_uri": "https%3A%2F%2Fclientresource.ru%2Fcb",
"client_type": "PRIVATE",
"code_challenge": "E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM",
"code_challenge_method": "S256"
}
],
"ext_redirect_uri": "googlechrome://example.com/external_login",
"package": "googlechrome://example.com/external_login",
}
Пример экрана ошибки (на стороне партнера), в случае несовпадения параметра state:
Кнопка «Войти по Сбер ID» в этом случае должна вести строго на стандартный сценарий входа в веб (Web to Web).