1. Авторизация и QR-подписание
RSID docs
Russian
  • English
  • Russian
  • Uzbek
  • Обзор интеграции
  • Веб SDK
    • Руководство по интеграции
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Создание сессии
      POST
    • Получение данных пользователя
      GET
  • Мобильный SDK
    • Руководство по интеграции
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Создание сессии
      POST
    • Получение данных пользователя
      GET
  • Backend с данными
    • Руководство по интеграции
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Вариант 1 — сравнение фото с фото из паспорта
      POST
    • Вариант 2 — сравнение двух фото с данными гражданина
      POST
    • Вариант 3 — сравнение двух фото без данных гражданина
      POST
    • Получение результата
      GET
  • Backend без данных
    • Руководство по интеграции
    • Авторизация (sign-in)
    • Обновление токена (refresh)
    • Вариант 1 — сравнение фото с фото из паспорта
    • Вариант 2 — сравнение двух фото с данными гражданина
    • Вариант 3 — сравнение двух фото без данных гражданина
  • Авторизация и QR-подписание
    • Вход через RS-ID (OAuth2)
    • Подписание по QR-коду
    • Получение данных пользователя по коду
      POST
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Создание QR-токена
      POST
    • Статус QR-токена по qr_id
      GET
    • Статус QR-токена по external_id
      GET
  • Schemas
    • ErrorResponse
    • AuthCodeRequest
    • ClientCredentials
    • Token
    • UserInfo
    • TokenResponseEnvelope
    • DocumentInfo
    • Signer
    • StringResponseEnvelope
    • ContactInfo
    • CallbackEvent
    • UserProfile
    • QrTokenCreateRequest
    • PhotoItem
    • Address
    • UserProfileResponseEnvelope
    • AdditionalParams
    • WebSessionCreateRequest
    • QrToken
    • UserProfileResponse
    • CompareFaceRequest
    • UserResponseEnvelope
    • CompareImagesWithInfoRequest
    • QrTokenResponseEnvelope
    • CompareImagesRequest
    • SignCallback
    • ComparisonResult
    • MobileSessionCreateRequest
    • ComparisonResultEnvelope
  1. Авторизация и QR-подписание

Подписание по QR-коду

Подписание по QR-коду электронной подписью (RS-IMZO / E-IMZO)#

1. Что такое подписание по QR-коду#

Подписание по QR-коду позволяет пользователю подписать содержимое с вашего сайта своей электронной подписью (RS-IMZO или E-IMZO), которая хранится в мобильном приложении RS-ID.
Ваш бэкенд создаёт QR-токен с содержимым для подписи. Ваш сайт показывает QR-код; пользователь сканирует его в мобильном приложении RS-ID, видит содержимое, выбирает ключ подписи и подписывает. RS-ID проверяет подпись, отправляет подписанные данные (PKCS#7) на ваш callback_url и отмечает QR-токен как завершённый.
Вам не нужно устанавливать плагины E-IMZO или работать с ключами подписи на сайте — подписание происходит на телефоне пользователя.

Сценарии использования#

СценарийПример
Подписание документовПользователь подписывает договор займа, аренды или оказания услуг, показанный на вашем сайте.
Согласование несколькими подписантамиДокумент должны подписать определённые люди или компании (по ПИНФЛ или ИНН); QR завершается, когда подписали все.
Вход с электронной подписьюВаш сайт помещает одноразовую случайную строку в sign_content; пользователь подписывает её, и после проверки подписи вы выполняете вход.
Подтверждение операцииПодписание платёжного поручения или заявки перед обработкой.

2. Терминология#

ТерминКто / что это
КлиентКомпания, которая интегрирует RS-ID (вы). Зарегистрирована в RS-ID как клиент Web SDK и получила client_id / client_secret. Включает бэкенд клиента и фронтенд клиента.
ПользовательЧеловек, который подписывает, — у него есть мобильное приложение RS-ID с добавленной электронной подписью.
Мобильное приложение RS-IDПриложение RS-ID на телефоне пользователя. Хранит электронные подписи пользователя и подписывает содержимое.
СерверСервер RS-ID: создаёт QR-токены, проверяет подписи и отправляет callback.
QR-токенОдин запрос на подписание, определяется qr_id. Имеет срок жизни (expire_time) и статус.
RS-IMZO / E-IMZOТипы электронной подписи (sign_method).
ПодписантЧеловек или компания, которым разрешено подписать, определяются по ПИНФЛ (14 цифр, физическое лицо) или ИНН (9 цифр, компания).
PKCS#7Стандартный формат подписанных данных (CMS), который RS-ID отправляет на ваш callback_url.

3. Как это работает#

1.
Ваш бэкенд проходит авторизацию (7.1) и создаёт QR-токен с содержимым для подписи (7.3).
2.
Ваш сайт показывает QR-код пользователю.
3.
Пользователь сканирует его в мобильном приложении RS-ID, читает содержимое и подписывает ключом RS-IMZO или E-IMZO (7.4).
4.
RS-ID проверяет подпись и то, что подписанту разрешено подписывать.
5.
RS-ID отправляет подписанные данные (PKCS#7) на ваш callback_url (7.5).
6.
Ваш бэкенд проверяет статус QR (7.6 / 7.7), пока он не станет COMPLETED или EXPIRED.

4. Схема интеграции#

integration-flow-qr-sign.png

5. Окружения#

ОкружениеБазовый URL APIСсылка (внутри QR-кода)
Stage (тестовое)https://sdk.stage.rsid.uz/web/apihttps://auth.stage.rsid.uz/{qr_id}
Productionhttps://sdk.rsid.uz/web/apihttps://auth.rsid.uz/{qr_id}
Для stage и production используются разные client_id / client_secret. QR-код, созданный на stage, сканируется только stage-версией приложения RS-ID.

6. Общие правила#

Формат ответа#

Все ответы API имеют одинаковую структуру:
{ "data": { }, "code": 0, "message": "Success" }
ПолеТипОписание
codeinteger0 — успех. Любое другое значение — ошибка (см. таблицы ошибок). Всегда проверяйте code, а не только HTTP-статус.
messagestringТекст на языке запроса (uz / ru / en). Не разбирайте его программно.
dataanyДанные ответа. Отсутствует при ошибке.

Заголовки#

ЗаголовокЗначениеГде используется
Content-Typeapplication/jsonВсе POST-запросы
AuthorizationBearer {access_token}Все запросы, кроме sign-in и refresh
Accept-Languageuz / ru / enНеобязательно — язык поля message

Безопасность#

client_secret и access_token хранятся только на вашем бэкенде. Фронтенду нужно только изображение или ссылка QR.
Проверяйте PKCS#7 сами, когда приходит callback: что подпись действительна, что подписанное содержимое совпадает с вашим sign_content и что сертификат принадлежит ожидаемому лицу (ПИНФЛ / ИНН).
Используйте HTTPS для callback_url и сопоставляйте callback со своей записью по external_id.

7. Описание API#

7.1 Авторизация (Sign in)#

Обменивает учётные данные клиента на токен доступа.
Метод - POST
Endpoint - {base_url}/v1/auth/sign-in — без заголовка Authorization
Content-Type (заголовок) - application/json

Тело запроса
ПолеТипОбязательноДлина / форматОписание
client_idstringДаНе пустое; не может начинаться с цифрыИдентификатор клиента Web SDK, выданный RS-ID.
client_secretstringДаНе пустоеСекрет клиента, выданный RS-ID.
{
  "client_id": "web-sdk-client",
  "client_secret": "s3cr3t-value"
}
Ответ
ПолеТипОписание
data.access_tokenstring (JWT)Токен для заголовка Authorization: Bearer.
data.token_typestringВсегда Bearer.
data.expires_inintegerСрок жизни токена в секундах.
data.scopestringВыданные права, через пробел.
data.refresh_tokenstring (JWT)Токен для получения нового access_token без повторной отправки учётных данных.
codeinteger0 при успехе.
messagestringТекст результата.
{
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "token_type": "Bearer",
    "expires_in": 3600,
    "scope": "read write",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  },
  "code": 0,
  "message": "Success"
}
Используйте access_token повторно до истечения срока, а не авторизуйтесь заново для каждого запроса.

7.2 Обновление токена (Refresh token)#

Выдаёт новый access_token по refresh_token без повторной авторизации. Вызывайте, когда access_token истёк (через expires_in секунд).
Метод - POST
Endpoint - {base_url}/v1/auth/refresh?token={refresh_token} — без заголовка Authorization.
Content-Type (заголовок) - application/json

Query-параметры
ПолеТипОбязательноДлина / форматОписание
tokenstringДаJWTrefresh_token из авторизации (7.1) или из предыдущего ответа обновления.
Тело запроса
ПолеТипОбязательноДлина / форматОписание
client_idstringДаНе пустое; не может начинаться с цифрыИдентификатор клиента Web SDK, выданный RS-ID.
client_secretstringДаНе пустоеСекрет клиента, выданный RS-ID.
{
  "client_id": "web-sdk-client",
  "client_secret": "s3cr3t-value"
}
Ответ — как в 7.1. Если refresh-токен истёк или недействителен, авторизуйтесь заново (7.1).

7.3 Создание QR-токена#

Создаёт запрос на подписание и возвращает QR-код.
Метод - POST
Endpoint - {base_url}/v1/qr
Authorization (заголовок) - Bearer {access_token}
Content-Type (заголовок) - application/json

Тело запроса
ПолеТипОбязательноДлина / форматОписание
sign_contentstringДаНе пустоеСодержимое, которое подписывает пользователь. Показывается пользователю в приложении RS-ID.
expire_timeintegerДа> 0, секундыСрок жизни QR-токена в секундах, например 300 (5 минут).
sign_methodstring (enum)НетRS_IMZO, E_IMZOРазрешённый тип подписи. Если не передан, пользователь может подписать любой своей подписью.
signersarrayНет—Кому разрешено подписать. Если не передан, подписать может любой пользователь, один раз. Если передан, каждый подписант подписывает один раз, и QR завершается, когда подписали все.
signers[].signerstringДа, если передан signersПИНФЛ (14 цифр) или ИНН (9 цифр)Человек или компания, которым разрешено подписать.
signers[].allow_idstringНет—Дополнительный идентификатор подписанта, сохраняется вместе с подписью.
external_idstringНетУникальный в рамках клиентаВаш собственный идентификатор (документа или заказа). Позволяет проверять статус по вашему id (7.7). Должен быть уникальным — повтор возвращает -1080.
callback_eventobjectНет—Настройки callback.
callback_event.callback_urlstringРекомендуетсяHTTPS URLКуда RS-ID отправит подписанные данные после каждой подписи (7.5).
redirect_urlstringНетURLСсылка, которая возвращается в приложение RS-ID после подписания.
document_provider_typestring (enum)НетHUJJAT_UZ, DIDOXПровайдер документа, если документ из него.
qr_response_typestring (enum)НетBASE64, DATA, ALLЧто вернуть. По умолчанию BASE64. BASE64 — изображение PNG; DATA — ссылка внутри QR; ALL — оба.
widthintegerНетpxШирина изображения QR. По умолчанию 100.
heightintegerНетpxВысота изображения QR. По умолчанию 100.
Примеры запросов
Подписывает любой пользователь
{
  "sign_content": "Договор № A-7781 от 09.11.2026. Я согласен с условиями договора об оказании услуг.",
  "expire_time": 300,
  "sign_method": "RS_IMZO",
  "external_id": "CONTRACT-A-7781",
  "callback_event": {
    "callback_url": "https://shop.example.uz/webhooks/rsid/sign"
  },
  "qr_response_type": "ALL",
  "width": 256,
  "height": 256
}
Определённые подписанты
Вход с электронной подписью
Ответ
ПолеТипОписание
data.qr_idstringИдентификатор QR-токена. Используйте его в 7.6.
data.qr_base64stringQR-код в виде изображения PNG в base64. Возвращается для BASE64 и ALL.
data.qr_datastringСсылка внутри QR-кода (https://auth.rsid.uz/{qr_id}). Возвращается для DATA и ALL.
data.expire_atstringВремя истечения, yyyy-MM-dd HH:mm:ss.
data.qr_statusstringACTIVE для нового токена.
codeinteger0 при успехе.
messagestringТекст результата.
{
  "data": {
    "qr_id": "9b2e6c1a-4f7d-4a3b-8e5c-1d2f3a4b5c6d",
    "qr_data": "https://auth.rsid.uz/9b2e6c1a-4f7d-4a3b-8e5c-1d2f3a4b5c6d",
    "qr_base64": "iVBORw0KGgoAAAANSUhEUgAAAQAAAAEAAQMAAABmvDolAAAABlBMVEX///8AAABVwtN+...",
    "expire_at": "2026-11-09 17:35:00",
    "qr_status": "ACTIVE"
  },
  "code": 0,
  "message": "Success"
}
Показывайте изображение через <img src="data:image/png;base64,{qr_base64}"> или рисуйте свой QR по qr_data.
Ошибки
КодПричина
-1002Учётные данные не принадлежат клиенту Web SDK.
-1080QR-токен с таким external_id уже существует.
-5Пользователь токена не найден.
400Ошибка валидации, например sign content cannot be blank или expire_time не передан / не положительный.

7.4 Действия пользователя в мобильном приложении RS-ID#

1.
Пользователь открывает мобильное приложение RS-ID и сканирует QR-код.
2.
Приложение показывает содержимое для подписи (sign_content).
3.
Пользователь выбирает электронную подпись (если задан sign_method, показываются только ключи этого типа). Если заданы signers, можно использовать только подписи с разрешённым ПИНФЛ / ИНН.
4.
Пользователь подписывает. Приложение отправляет подпись (PKCS#7) в RS-ID.
5.
RS-ID проверяет подпись и отправляет callback (7.5).
Приложение показывает ошибку, и подпись не принимается, если:
СитуацияРезультат
Срок QR-токена истёкQR token expired — создайте новый QR-токен.
QR-токен уже завершёнQR token completed.
ПИНФЛ / ИНН подписи нет в signersПользователю не разрешено подписывать.
Этот подписант уже подписалДокумент уже подписан этой подписью.
Все подписанты уже подписалиДокумент полностью подписан.

7.5 Callback с подписанными данными#

После каждой успешной подписи RS-ID отправляет POST-запрос на callback_event.callback_url.
Метод - POST
URL - ваш callback_url
Content-Type - application/json
Тело запроса (отправляет RS-ID)
ПолеТипОписание
sign_request_datastringJSON вашего исходного запроса на создание (7.3) в виде строки. Найдите свою запись по его external_id.
pkcs7stringПодписанные данные, PKCS#7 (CMS) в base64. Содержит подписанное содержимое, подпись и сертификат подписанта.
{
  "sign_request_data": "{\"signers\":null,\"expire_time\":300,\"sign_method\":\"RS_IMZO\",\"sign_content\":\"Договор № A-7781 от 09.11.2026. Я согласен с условиями договора об оказании услуг.\",\"redirect_url\":null,\"external_id\":\"CONTRACT-A-7781\",\"document_provider_type\":null,\"callback_event\":{\"callback_url\":\"https://shop.example.uz/webhooks/rsid/sign\"},\"qr_response_type\":\"ALL\",\"width\":256,\"height\":256}",
  "pkcs7": "MIIKvgYJKoZIhvcNAQcCoIIKrzCCCqsCAQExDjAMBggqhlADAgIBAQUAMIIBDgYJKoZIhvcNAQcBoIIA..."
}
Ваш ответ — верните HTTP 200. Callback отправляется один раз и не повторяется, поэтому также проверяйте статус через 7.6 / 7.7.
При нескольких signers callback отправляется после каждой подписи.

7.6 Статус QR-токена по qr_id#

Метод - GET
Endpoint - {base_url}/v1/qr/{qr_id}
Authorization (заголовок) - Bearer {access_token}

Параметры пути
ПолеТипОбязательноДлина / форматОписание
qr_idstringДаUUIDИз 7.3.
Ответ
ПолеТипОписание
data.qr_idstringИдентификатор QR-токена.
data.qr_statusstringACTIVE — ожидает подписи; COMPLETED — подписано (всеми signers, если заданы); EXPIRED — срок истёк; DELETED — удалён.
data.expire_atstringВремя истечения, yyyy-MM-dd HH:mm:ss.
data.qr_datastringСсылка внутри QR-кода.
data.qr_base64stringИзображение QR (PNG 100×100, base64) — чтобы показать его снова.
{
  "data": {
    "qr_id": "9b2e6c1a-4f7d-4a3b-8e5c-1d2f3a4b5c6d",
    "qr_data": "https://auth.rsid.uz/9b2e6c1a-4f7d-4a3b-8e5c-1d2f3a4b5c6d",
    "qr_base64": "iVBORw0KGgoAAAANSUhEUgAAAGQAAABkAQMAAABKLAcXAAAABlBMVEX///8AAABVwtN+...",
    "expire_at": "2026-11-09 17:35:00",
    "qr_status": "COMPLETED"
  },
  "code": 0,
  "message": "Success"
}
Опрашивайте каждые несколько секунд, пока qr_status = ACTIVE.
Ошибки
КодПричина
-1035QR-токен не найден или принадлежит другому клиенту.
-1002Учётные данные не принадлежат клиенту Web SDK.

7.7 Статус QR-токена по external_id#

То же, что 7.6, но по вашему external_id из 7.3.
Метод - GET
Endpoint - {base_url}/v1/qr/status/by-external/{external_id}
Authorization (заголовок) - Bearer {access_token}

Параметры пути
ПолеТипОбязательноДлина / форматОписание
external_idstringДа—external_id из 7.3.
Ответ — как в 7.6.
Ошибки — как в 7.6.

8. Коды ошибок#

КодНазваниеЗначение
0SUCCESSУспех.
-5BAD_CREDENTIALSНеверные учётные данные или пользователь токена не найден.
-9SYSTEM_ERRORНепредвиденная ошибка сервера.
-1000BAD_REQUESTНекорректный запрос.
-1002CLIENT_NOT_PERMITTEDНе клиент Web SDK.
-1035INVALID_QR_TOKENQR-токен не найден или принадлежит другому клиенту.
-1080QR_TOKEN_EXISTS_BY_EXTERNAL_IDQR-токен с таким external_id уже существует.
Modified at 2026-11-10 07:05:42
Previous
Вход через RS-ID (OAuth2)
Next
Получение данных пользователя по коду
Built with