Интеграция

Подключение Persona Claims к сервису

Поток запроса и ответа, проверки подписи и примеры на TypeScript с пакетами @persona-claims/verifier и @persona-claims/issuer.

Поток

Приёмник данных, бумажник и проверка — четыре шага.

Persona Claims — это запрос и ответ. Приёмник данных говорит, какие утверждения нужны, бумажник возвращает их, а библиотека или HTTP-обработчик проверяют подпись и доверие.

1

Запрос утверждений

Приёмник данных описывает, какие утверждения нужны: возраст, имя, статус, право доступа.

2

Ответ бумажника

Бумажник возвращает выбранные утверждения после явного согласия пользователя.

3

Проверка контейнера

Приёмник проверяет подпись, срок действия, отзыв и доверие к источнику данных.

4

Действие в сервисе

Если всё корректно, сервис выполняет нужное действие: регистрацию, доступ, оплату.

Транспорт

Как запрос и ответ перемещаются между сервисом и бумажником.

Persona Claims не привязан к одному каналу: приёмник данных формирует запрос, бумажник возвращает подписанный ответ — а сам путь зависит от устройства и сценария.

Шаг 1

Сервис → бумажник

Запрос можно передать ссылкой, QR-кодом или локальным каналом. Сервис сам выбирает, как доставить его пользователю.

Десктоп → телефон

QR-код

Сервис отображает QR-код со ссылкой на запрос. Пользователь сканирует его бумажником на телефоне.

Тот же телефон

Ссылка в приложение

Кнопка «Открыть в бумажнике» ведёт по ссылке, которую операционная система передаёт приложению-бумажнику.

На устройстве

Системное окно отправки

Страница открывает системное окно «Поделиться», а пользователь выбирает в нём бумажник.

Локально

NFC, Bluetooth или SIM

Для офлайн-сценариев запрос передаётся коротким радиоканалом или с карты, без интернета.

Шаг 2

Бумажник → сервис

После согласия пользователя бумажник формирует ответ с подписями и отправляет его в сервис, который выступает приёмником данных.

HTTPS-запрос в сервис

Стандартный путь

Бумажник отправляет подписанный ответ POST-запросом на адрес сервиса, указанный в запросе.

Возврат через браузер

Тот же браузер

Веб-бумажник или мобильный бумажник возвращает пользователя в браузер вместе с ответом.

Локальная передача

Офлайн

Для NFC, Bluetooth и карт ответ возвращается тем же каналом, по которому пришёл запрос.

Сервис

Веб-страница

Бумажник

Подпись и согласие

Сервис

Проверка ответа

Примеры

Полный флоу каждой роли.

Три роли — три полных жизненных цикла на одном SDK. Verifier принимает готовый claim с challenge/response. Persona request инициирует диалог с бумажником и проверяет PersonaResponse. Issuer ведёт выпуск, отзыв, CRL, rotation request от subject и ротацию собственного ключа.

Установка
Verifier
зависимости
$ npm install express @persona-claims/verifier @persona-claims/core
переменные окружения
$ export VERIFIER_PUBLIC_KEY=...
Пакеты в npm

В npm опубликованы три пакета: @persona-claims/verifier — логика приёмника данных, @persona-claims/issuer — выпуск, отзыв и ротация ключей источника, и общий @persona-claims/core с типами и DNS-резолверами. Они транспортно-независимы: ни HTTP-сервера, ни маршрутов — встраиваются в любой ваш сервис, очередь или background-воркер.

Verifier

Приём готового утверждения от бумажника

Express + @persona-claims/verifier

Бумажник присылает уже выпущенные claim-конверты. Сервис проверяет подпись эмитента через DNS-якорь (с DNSSEC, если включён strict), срок действия, отзыв и заставляет пользователя доказать владение subject-ключом по challenge/response.

import express from 'express';
import { Verifier, type Session } from '@persona-claims/verifier';
import { ClaimSchema, ConfirmationSchema, dns } from '@persona-claims/core';

// 1. Один Verifier на процесс. publicKey — публичный ключ нашего верификатора,
//    с которым у выпущенных нам claim'ов связано поле `ref` (опционально).
//    dnsPolicy: 'strict' требует DNSSEC-доказательства для TXT-записей эмитентов.
const verifier = new Verifier({
  publicKey: process.env.VERIFIER_PUBLIC_KEY!,
  resolver: new dns.NodeResolver(),
  dnsPolicy: 'strict'
});

// Сессии бумажника хранятся между двумя запросами (start → verify).
// В проде — Redis/БД; здесь — Map для краткости.
const sessions = new Map<string, Session>();

const app = express();
app.use(express.json());

// 2. Бумажник кладёт claim'ы. Verifier по спеке возвращает ОДИН nonce и
//    список уникальных subject-ключей, для которых нужны подтверждения.
app.post('/api/persona/start', (req, res) => {
  const claims = req.body.claims.map((c: unknown) => ClaimSchema.parse(c));
  const session = verifier.start(claims);
  sessions.set(req.body.sessionId, session);
  res.json({
    challenge: session.challenge,     // одно значение-задача на сессию
    subjectKeys: session.subjectKeys  // одно подтверждение на каждый ключ, не на claim
  });
});

// 3. Бумажник возвращает confirmations[] — по одной на уникальный subject-ключ.
//    Каждая confirmation — это подпись общего challenge соответствующим ключом.
app.post('/api/persona/verify/:sessionId', async (req, res) => {
  const session = sessions.get(req.params.sessionId);
  if (!session) return res.status(400).json({ error: 'нет активной сессии' });
  sessions.delete(req.params.sessionId);

  const confirmations = req.body.confirmations.map((c: unknown) => ConfirmationSchema.parse(c));
  const status = await session.verify(confirmations);
  if (!status.ok) {
    // status.results[].reason — причина отказа: 'claim expired', 'claim revoked',
    // 'invalid issuer signature', 'proof of possession failed', 'unknown challenge' и т.п.
    return res.status(400).json({ error: 'не прошло проверку', results: status.results });
  }

  await allowUserAction(req.params.sessionId, status.results);
  res.json({ ok: true });
});
Что проверяется

Библиотека закрывает рутинные проверки сама.

Достаточно вызвать verifyResponse — и сервис получает уже проверенный результат вместо сырых данных.

Подпись источника данных

Утверждение подписано банком, вузом, работодателем или другим источником данных.

Срок и отзыв

Проверка учитывает срок действия утверждения и статус отзыва у источника данных.

Получатель и цель

Ответ адресован именно вашему сервису и привязан к конкретному запросу.

Готовы подключать

Persona Claims — открытый протокол с понятным способом подключения.

Возьмите подходящий пример, замените URL и ключи на свои — и проверка утверждений уже работает в вашем сервисе.

Вернуться на главную