BACKEND
Шаг 1. Обработка токенов
На стороне бэкэнда обеспечьте надежную обработку токенов авторизации, включая своевременное обновление access-токена и refresh-токена. Токены периодически истекают, и важно поддерживать актуальность сеанса пользователя.
Подробнее о работе access-токена и refresh-токена
Важно если данные для бейджика собираются на стороне Партнера необходимо обеспечить обработку OAuth_token'a см. ниже
Обработка OAuth_token'a
Сервер партнера запрашивает для себя авторизационный токен со скопом "api/v1/badgeinfo"
Описание атрибутов запроса
| # | Имя | Заголовок/поле | Обязательный | Описание |
|---|---|---|---|---|
| 1 | RqUID | Заголовок | Да | Уникальный идентификатор сообщения, «maxLength=32 и pattern=([0-9][a-f][A-F])32)», переданный во входящем сообщении. Необходим для журналирования входящих вызовов и удобства разбора инцидентов. Чтобы обеспечить уникальность, можно использовать стандартные библиотеки и классы для генерации UUID/GUID (https://ru.wikipedia.org/wiki/UUID ), убрав из результата разделители «-». |
| 2 | Content-Type | Заголовок | Нет | Тип передаваемых данных. |
| 3 | accept | Заголовок | Нет | Может принимать значения application/json. |
| 4 | Authorization | Заголовок | Да | Авторизационные данные. Необходимо в поле указать слово "Basic" и через пробел передать закодированные в BASE64 значения client id и client secret разделенные двоеточием (Basic client id:client secret) |
| 5 | grant_type | Поле | Да | Указывается равным client_credentials |
| 6 | scope | Поле | Да | Область видимости (scope), которая предоставляется Клиенту: список URL API, для которых партнер проходит авторизацию. Если URL API несколько, указывается через пробел. Указывается равным api/v1/badgeinfo. |
Пример запроса
POST 'https://oauth-ift.sber.ru/ru/prod/tokens/v2/oauth' \
--header 'accept: application/json' \
--header 'rquid: 012345678901234567890123456789FF' \
--header 'content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic NDBjMWQ1ZGEtMTUzMi0xMWViLWFkYzEtMDI0MmFjMTIwMDAyOjJiYWViODMwLTQyODgtNGY1Yy1iZmZmLWEwMjBkOGFmYWI5Yw=='\
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=api/v1/badgeinfo'
POST 'https://oauth.sber.ru/ru/prod/tokens/v2/oauth' \
--header 'accept: application/json' \
--header 'rquid: 012345678901234567890123456789FF' \
--header 'content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic NDBjMWQ1ZGEtMTUzMi0xMWViLWFkYzEtMDI0MmFjMTIwMDAyOjJiYWViODMwLTQyODgtNGY1Yy1iZmZmLWEwMjBkOGFmYWI5Yw=='\
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=api/v1/badgeinfo'
Описание атрибутов ответа
| # | Название параметра | Описание | Пример |
|---|---|---|---|
| 1 | access_token | Сгенерированный Access-токен. | f213a511-58d7-4e7c-88b3-a6de380c81da |
| 2 | token_type | Тип запрашиваемого токена. Всегда передается значение «Bearer». | Bearer |
| 3 | expires_in | Время в секундах, в течение которого действует Access Token. | 60 |
Пример ответа
HTTP/1.1 200 OK rquid: 012345678901234567890123456789FF
{
"access_token": "71aab398-acab-4eeb-84bd-99e546751d66",
"token_type": "bearer",
"expires_in": 1234
}
Шаг 2. Генерация и передача идентификатора пользователя
Организуйте генерацию уникального идентификатора пользователя (userID), необходимого для идентификации запросов на сервер ЕЛК.
Этот идентификатор создается вами и используется в коммуникациях с нашим API.
Правила формирования userID:
- Уникален для каждого пользователя;
- Генерируется и хранится на стороне партнера.
Шаг 3. Прокси-обработка запросов
Настройте обработку запросов, поступающих от SDK, как прокси-сервер.
Последовательность действий:
-
Получение запроса от SDK. Примите HTTP-запросы от фронтальной стороны.
-
Передача запроса на сервер ЕЛК. Преобразуйте полученный запрос в нужный формат и отправьте его на сервер ЕЛК.
-
Обработка ответа от ЕЛК. Получите ответ от нашего сервера и верните его обратно в SDK
Если ответ требует дополнительной обработки (например, изменение имени или аватара пользователя), воспользуйтесь рекомендациями из специального раздела (Изменение аватара и имени пользователя)
Рассмотрим простые примеры того, как обрабатывать запросы от SDK и передавать их далее на сервер ЕЛК, а затем возвращать обработанные ответы в SDK.
Пример обработки запроса и ответа по виджетам ЕЛК
SDK отправляет на ваш сервер (url переданный в partnerProfileUrl при инициализации SDK) следующий запрос:
| # | Имя | Тип | Обязательный | Описание | Пример |
|---|---|---|---|---|---|
| 1 | Authorization | Заголовок | Да | Токен сессии. К значению userID/sessionId (полученному при инициализации SDK) в начале добавляется «Bearer ». | Bearer DC3641EC-A0C1-F61A-B2DE-A331C0B2E20F |
| 2 | [Ключ от партнера] | Заголовок | Нет | Один или несколько ключей и их значения, полученные от партнера при инициализации в параметре headersELK. | first: oneUser-Agent: Ktor client |
| 3 | Accept | Заголовок | Да | Ожидаемый тип ответа. | application/json |
| 4 | Content-Type | Заголовок | Да | Тип передаваемых данных. | application/json |
| Параметр | Тип | Обязательный | Описание | Пример |
|---|---|---|---|---|
| url | String | Да | Адрес, который партнер должен использовать для запроса данных на сервер ЕЛК (Единой Лиги Клиентов). | https://oauth-ift.sber.ru/api/v1/userdata?infoSource=userInfo&widgetName=listDataDefault |
Пример полного тела запроса (JSON):
{
"url": "https://oauth-ift.sber.ru/api/v1/userdata?infoSource=[Тип ресурсной системы]&widgetName=[Название шаблона]"
}
{
"url": "https://oauth.sber.ru/api/v1/userdata?infoSource=[Тип ресурсной системы]&widgetName=[Название шаблона]"
}
Процесс инициализации вызова ЕЛК
-
Предварительная проверка сервером партнера
- Перед инициализацией вызова сервера ЕЛК, сервер партнера проверяет активность access-токена пользователя.
- При необходимости сервер партнера осуществляет его обновление ("подогрев").
-
Условие: Отсутствие токенов
- Если сервер партнера не находит у себя ни активного access-токена, ни refresh-токена пользователя,
- То сервер партнера должен вернуть в SDK ошибку 401 Unauthorized.
Формат ответа об ошибке:
HTTP/1.1 401 Unauthorized
{
"error": "unauthorized_client"
}
- Запрос данных для виджетов ЕЛК
- При успешной проверке токенов сервер партнера направляет запрос на сервер ЕЛК.
- Адрес запроса получен в запросе от SDK
- Тип запроса GET
Параметры запроса
| № | Имя (Name) | Расположение (In) | Описание | Обязательный |
|---|---|---|---|---|
| 1 | infoSource | query | Список источников данных. Получен от SDK. | Да |
| 2 | widgetName | query | Наименование шаблона. Получен от SDK. | Да |
| 3 | x-introspect-rquid | header | Уникальный идентификатор сообщения (maxLength=32, pattern=([0-9][a-f][A-F]){32}). Необходим для журналирования. Для генерации можно использовать UUID/GUID, удалив разделители «-». | Да |
| 4 | Authorization | header | Полученный ранее access-токен. Должен иметь префикс Bearer. Пример: Bearer DC3641EC-A0C1-F61A-B2DE-A331C0B2E20F. ` | Да |
Пример запроса (cURL):
curl --request GET \
'https://oauth-ift.sber.ru/api/v1/userdata?infoSource=[Тип источника данных]&widgetName=[Название шаблона]' \
--header 'x-Introspect-RqUID: 55286baf3d4548da8d2252b2a8337f20' \
--header 'Authorization: Bearer 4cf09bfb-ce00-4847-9f24-28377692baf7'
curl --request GET \
'https://oauth.sber.ru/api/v1/userdata?infoSource=[Тип источника данных]&widgetName=[Название шаблона]' \
--header 'x-Introspect-RqUID: 55286baf3d4548da8d2252b2a8337f20' \
--header 'Authorization: Bearer 4cf09bfb-ce00-4847-9f24-28377692baf7'
Сервер партнера без дополнительной обработки на своей стороне возвращает ответ в SDK.
Пример ответов
{
"title": "Иван К",
"icon": "https://stat.online.sberbank.ru/SBERBANKID/icons/CODE16206.png",
"iconSize": "40",
"badge": "https://id.sber.ru/profile/external_partners/elk_assets/badge-gradient.png",
"initials": "ИК",
"value": "+7 900 000 00 00",
"click": {
"browserUrl": "https://id.sber.ru/profile/?utm_source=partner_profile&utm_medium=app_samokat&utm_campaign=button_nmt"
}
}
| Наименование параметра | Заголовок/Ключ | Описание | Обязательность поля |
|---|---|---|---|
| title | body | Имя пользователя | Да |
| icon | body | Ссылка на аватарку (пока не передаем) | Нет |
| iconSize | body | Размер аватарки | Нет |
| badge | body | Ссылка на иконку SberID | Да |
| initials | body | Инициалы пользователя | Нет |
| value | body | НМТ | Нет |
| click | body | Информация о переходе при нажатии на виджет | Нет |
| .browserUrl | body | Открывается ссылка в браузере устройства по url | Нет |
| .deepLinkUrl | body | Открывается ссылка в браузере устройства по диплинку | Нет |
| .nativeUrl | body | Открывается нативная шторка | Нет |
| .sso | body | Открыть с помощью 'app_token' бесшовные переход | Да |
| ..webLink | body | Ссылка на поверхность партнера | Да |
| ..openIn | body | Возможные значения: - browser - webview | Н ет |
| ..clientId | body | ID партнера на которого осуществляется переход | Нет |
{
"title": "Бонусы Спасибо",
"value": "30 000",
"titleIcon": "https://id.sber.ru/profile/external_partners/elk_assets/spasibo-gradient.png",
"click": {
"browserUrl": "samokat://?action=sber_spasibo"
}
}
| Наименование параметра | Заголовок/Поле | Описание | Обязательность поля |
|---|---|---|---|
| title | body | Текст в баннере (наименование виджета) Название подписи | Нет |
| titleicon | body | Иконка виджета | Да |
| description | body | Статус подписи если подпись активна | Нет |
| value | body | Значение бонусного баланса | Нет |
| click | body | Способ открытия при клике на виджет | Нет |
| .browserUrl | body | Открывается ссылка в браузере устройства по url | Нет |
| .deepplinkUrl | body | Открывается ссылка в браузере устройства по диплинку | Нет |
| .nativeUrl | body | Открывается нативная шторка | Нет |
| .sso | body | Открыть с помощью 'app_token' бесшовные переход | Да |
| ..webLink | body | Ссылка на поверхность партнера | Да |
| ..openIn | body | Возможные значения: - browser - webview | Нет |
| ..clientId | body | ID партнера на которог о осуществляется переход | Нет |
{
"title": "СберПрайм+",
"titleIcon": "https://id.sber.ru/profile/external_partners/elk_assets/prime-gradient.png",
"description": "Активна",
"click": {
"sso": {
"webLink": "https://www.sberbank.com/sberprime/me?utm_source=elk_app&utm_medium=samokat&utm_campaign=1",
"openIn": "browser",
"clientId": "6db1c92c-ed87-4939-bc32-1f155b58e6c4"
}
}
}
| Наименование параметра | Заголовок/Поле | Описание | Обязательность поля |
|---|---|---|---|
| title | body | Текст баннера (наименование виджета) Название подписки | Да |
| titleicon | body | Иконка виджета | Да |
| description | body | Описание статуса виджета (подписи) - Активна - Подключить - Не активна - Ожидает оплаты (оранжевый цвет) | Да |
| click | body | Способ открытия при клике на виджет | Нет |
| .sso | body | Открыть с помощью 'app_token' бесшовные переход | Да |
| ..webLink | body | Ссылка на поверхность партнера | Да |
| ..openIn | body | Возможные значения: - browser - webview | Нет |
| ..clientId | body | ID партнера на которого осуществляется переход | Нет |
Пример обработки запроса и ответа по бейджу
Для партнера получающего данные для бейджика самостоятельно
SDK отправляет на ваш сервер (url переданный в partnerProfileUrl при инициализации SDK) следующий запрос:
URL: https://zvuk.com/
HTTP Headers: ["Accept": "application/json", "Authorization": "Bearer 2ffuy3vv7sk11ddfsxn6", "Content-Type": "application/json"]
HTTP Method: POST
HTTP Body: {
"url" : "https://oauth-ift.sber.ru/api/v1/badgeinfo?widgetName=[Название шаблона]"
}
URL: https://zvuk.com/
HTTP Headers: ["Accept": "application/json", "Authorization": "Bearer 2ffuy3vv7sk11ddfsxn6", "Content-Type": "application/json"]
HTTP Method: POST
HTTP Body: {
"url" : "https://oauth.sber.ru/api/v1/badgeinfo?widgetName=[Название шаблона]"
}
Описание атрибутов запроса
| # | Имя | Тип | Обязательный | Описание | Пример |
|---|---|---|---|---|---|
| 1 | Authorization | Заголовок | Да | Токен сессии. К значению userID/sessionId (полученному при инициализации SDK) в начале добавляется «Bearer ». | Bearer DC3641EC-A0C1-F61A-B2DE-A331C0B2E20F |
| 2 | [Ключ от партнера] | Заголовок | Нет | Один или несколько ключей и их значения, полученные от партнера при инициализации в параметре headersELK. | first: oneUser-Agent: Ktor client |
| 3 | url | String | Да | Адрес запроса передаваемый партнеру для запроса данных. | https://oauth.sber.ru/api/v1/badgeinfo?widgetName=listDataDefault |
Описание атрибутов запроса api/v1/badgeinfo
- Адрес запроса получен в запросе от SDK
- Тип запроса POST
| # | Имя | Заголовок/поле | Обязательность | Описание |
|---|---|---|---|---|
| 1 | widgetName | query | Да | Наименование виджета. Получен от SDK |
| 2 | x-introspect-rquid | header | Да | Уникальный идентификатор сообщения, «maxLength=32 и pattern=([0-9][a-f][A-F])32)», переданный во входящем сообщении. Необходим для журналирования входящих вызовов и удобства разбора инцидентов. Чтобы обеспечить уникальность, можно использовать стандартные библиотеки и классы для генерации UUID/GUID(https://ru.wikipedia.org/wiki/UUID ), убрав из результата разделители «-». |
| 3 | Authorization | header | Да | Полученный ранее OAuth_token. В начало необходимо добавить «Bearer», например: Bearer DC3641EC-A0C1-F61A-B2DE-A331C0B2E20F |
| 4 | bonusBalance.isActive | body | Нет | Признак наличия подключенной программы СберСпасибо |
| 5 | subscription.isActive | body | Нет | Признак наличия активной подписки Прайм |
Пример запроса api/v1/badgeinfo
curl --request POST 'https://oauth-ift.sber.ru/api/v1/badgeinfo?widgetName=[Название виджета]' \
--header 'x-Introspect-RqUID: 55286baf3d4548da8d2252b2a8337f20' \
--header 'Authorization: Bearer 4cf09bfb-ce00-4847-9f24-28377692baf7'
--data '{
"bonusBalance": {
"isActive": true
},
"subscription": {
"isActive": true
}
}'
curl --request POST 'https://oauth.sber.ru/api/v1/badgeinfo?widgetName=[Название виджета]' \
--header 'x-Introspect-RqUID: 55286baf3d4548da8d2252b2a8337f20' \
--header 'Authorization: Bearer 4cf09bfb-ce00-4847-9f24-28377692baf7'
--data '{
"bonusBalance": {
"isActive": true
},
"subscription": {
"isActive": true
}
}'
Cервер Партнера получив ответ от сервера ЕЛК дополняет ответ своими данными и перенаправляет его в SDK
HTTP/1.1 200 ОК {
"widgets": [
{
"type": "subscriptions",
"title": "За выгодой",
"icon": "${FRONT_STATIC_HOST}${FRONT_STATIC_ASSETS_PATH}/prime.png",
"click": {
"browserUrl": "https://-----"
}
},
{
"type": "bonusBalance",
"title": "",
"icon": "${FRONT_STATIC_HOST}${FRONT_STATIC_ASSETS_PATH}/prime.png",
"click": {
"browserUrl": "https://-----"
}
}
]
}
| Наименование параметра | Заголовок/Поле | Описание | Обязательность поля |
|---|---|---|---|
| widgets | body | Массив бейджиков | Да |
| .type | body | Тип бейджика | Да |
| .title | body | Заголовок бейджика | Да |
| .icon | body | Ссылка на иконку бейджика | Нет |
| .click | body | Информация о переходе при нажатии на бейджик | Нет |
| ..browserUrl | body | Открывается ссылка в браузере устройства по url | Нет |
| ..sso | body | Атрибуты для бесшовного перехода | Нет |
| ...webLink | body | Ссылка для перехода | Да |
| ...openIn | body | Возможные значения: - browser - webview | Да |
| ...clientId | body | ID партнера на которого осуществляется переход | Да |
Пример для партнера получающего данные для бейджика от сервера ЕЛК
SDK отправляет на ваш сервер (url переданный в partnerProfileUrl при инициализации SDK) следующий запрос:
URL: https://zvuk.com/
HTTP Headers: ["Accept": "application/json", "Authorization": "Bearer 2ffuy3vv7sk11ddfsxn6", "Content-Type": "application/json"]
HTTP Method: POST
HTTP Body: {
"url" : "https://oauth-ift.sber.ru/api/v1/badgeinfo-provider?infoSource=primeSubscription&widgetName=[Название шаблона]"
}
URL: https://zvuk.com/
HTTP Headers: ["Accept": "application/json", "Authorization": "Bearer 2ffuy3vv7sk11ddfsxn6", "Content-Type": "application/json"]
HTTP Method: POST
HTTP Body: {
"url" : "https://oauth.sber.ru/api/v1/badgeinfo-provider?infoSource=primeSubscription&widgetName=[Название шаблона]"
}
Описание атрибутов запроса
| # | Имя | Тип | Обязательный | Описание | Пример |
|---|---|---|---|---|---|
| 1 | Authorization | Заголовок | Да | Токен сессии. К значению userID/sessionId (полученному при инициализации SDK) в начале добавляется «Bearer ». | Bearer DC3641EC-A0C1-F61A-B2DE-A331C0B2E20F |
| 2 | [Ключ от партнера] | Заголовок | Нет | Один или несколько ключей и их значения, полученные от партнера при инициализации в параметре headersELK. | first: oneUser-Agent: Ktor client |
| 3 | url | String | Да | Адрес запроса передаваемый партнеру для запроса данных. | https://oauth-ift.sber.ru/api/v1/badgeinfo-provider?infoSource=primeSubscription&widgetName=listDataDefault |
Описание атрибутов запроса api/v1/badgeinfo-provider
- Адрес запроса получен в запросе от SDK
- Тип запроса POST
| # | Имя | Заголовок/поле | Обязательность | Описание |
|---|---|---|---|---|
| 1 | widgetName | query | Да | Наименование виджета. Получен от SDK |
| 2 | x-introspect-rquid | header | Да | Уникальный идентификатор сообщения, «maxLength=32 и pattern=([0-9][a-f][A-F])32)», переданный во входящем сообщении. Необходим для журналирования входящих вызовов и удобства разбора инцидентов. Чтобы обеспечить уникальность, можно использовать стандартные библиотеки и классы для генерации UUID/GUID(https://ru.wikipedia.org/wiki/UUID ), убрав из результата разделители «-». |
| 3 | Authorization | header | Да | Полученный ранее access-токен. В начало необходимо добавить «Bearer», например: Bearer DC3641EC-A0C1-F61A-B2DE-A331C0B2E20F |
| 4 | bonusBalance.isActive | body | Нет | Признак наличия подключенной программы СберСпасибо |
| 5 | subscription.isActive | body | Нет | Признак наличия активной подписки Прайм |
Пример запроса api/v1/badgeinfo-provider
curl --request POST 'https://oauth-ift.sber.ru/api/v1/badgeinfo-provider?infoSource=primeSubscription&widgetName=[Название виджета]' \
--header 'x-Introspect-RqUID: 55286baf3d4548da8d2252b2a8337f20' \
--header 'Authorization: Bearer 4cf09bfb-ce00-4847-9f24-28377692baf7'
--data '{
"bonusBalance": {
"isActive": true
},
"subscription": {
"isActive": true
}
}'
curl --request POST 'https://oauth.sber.ru/api/v1/badgeinfo-provider?infoSource=primeSubscription&widgetName=[Название виджета]' \
--header 'x-Introspect-RqUID: 55286baf3d4548da8d2252b2a8337f20' \
--header 'Authorization: Bearer 4cf09bfb-ce00-4847-9f24-28377692baf7'
--data '{
"bonusBalance": {
"isActive": true
},
"subscription": {
"isActive": true
}
}'
Cервер Партнера получив ответ от сервера ЕЛК перенаправляет его в SDK (выступает в роли прокси-сервера)
HTTP/1.1 200 ОК {
"widgets": [
{
"type": "subscriptions",
"title": "За выгодой",
"icon": "${FRONT_STATIC_HOST}${FRONT_STATIC_ASSETS_PATH}/prime.png",
"click": {
"browserUrl": "https://-----"
}
},
{
"type": "bonusBalance",
"title": "6 234",
"icon": "${FRONT_STATIC_HOST}${FRONT_STATIC_ASSETS_PATH}/prime.png",
"click": {
"browserUrl": "https://-----"
}
}
]
}
| Наименование параметра | Заголовок/Поле | Описание | Обязательность поля |
|---|---|---|---|
| widgets | body | Массив бейджиков | Да |
| .type | body | Тип бейджика | Да |
| .title | body | Заголовок бейджика | Да |
| .icon | body | Ссылка на иконку бейджика | Нет |
| .click | body | Информация о переходе при нажатии на бейджик | Нет |
| ..browserUrl | body | Открывается ссылка в браузере устройства по url | Нет |
| ..sso | body | Атрибуты для бесшовного перехода | Нет |
| ...webLink | body | Ссылка для перехода | Да |
| ...openIn | body | Возможные значения: - browser - webview | Да |
| ...clientId | body | ID партнера на которого осуществляется переход | Да |
Таким образом, выполнение перечисленных шагов позволит эффективно организовать back-end взаимодействие с сервисом ЕЛК и минимизировать возможные проблемы интеграции.