Интеграция сводится к одному вызову на клиенте — authenticate(scope, nonce) — который возвращает одноразовый код авторизации. Ваше приложение передаёт этот код на сервер, а тот обменивает его у Paspo ID на данные пользователя.
Весь обмен между приложением и Paspo ID защищён end-to-end шифрованием (ECDH P-256 + AES-256-GCM, эфемерные ключи хранятся только в памяти) и полностью выполняется SDK — криптографические операции с вашей стороны не требуются.
sequenceDiagram
participant B as Ваш сервер
participant A as Ваше приложение (SDK)
participant P as Приложение Paspo ID
participant PS as Сервер Paspo ID
A->>B: запрос nonce
B-->>A: nonce
A->>P: authenticate(scope, nonce)
Note over A,P: эфемерный ключ ECDH, end-to-end шифрование
P->>PS: проверка подписи и package приложения
Note over P: экран согласия пользователя
P-->>A: зашифрованный ответ
Note over A: расшифровка -> Success(authCode)
A->>B: authCode
B->>PS: обмен authCode (server-to-server)
PS-->>B: данные профиля пользователя
authenticate(scope, nonce). SDK генерирует эфемерную пару ключей ECDH и открывает приложение Paspo ID.authCode.authCode на сервер, который обменивает его — напрямую, сервер-сервер — у Paspo ID на подтверждённые данные профиля пользователя.Это нельзя перенести на клиент — именно это делает поток безопасным:
authCode одноразовый и сам по себе не содержит персональных данных; данные пользователя передаются только по вашему защищённому каналу сервер-сервер.SDK обнаруживает это, сохраняет nonce, открывает страницу приложения/Play Store для Paspo ID и возвращает результат NotInstalled вместо исключения. После установки Paspo ID и повторного вызова сохранённый nonce передаётся для атрибуции установки. Точный тип результата — в справочнике Android.
Ваш сервер получает только те поля профиля, которые вы запросили в scope — номер телефона, e-mail, национальное удостоверение или постоянный Paspo ID пользователя, — но никогда не сырые биометрические данные. Сопоставление Face ID и Voice ID происходит полностью на устройстве, внутри приложения Paspo ID.