Перейти к содержанию

Панель PKI гражданина — эндпойнты для RP (расширение только на стороне Go)

Дата: 2026-07-04. Запрос: template.gerege.mn/docs/EID_ENDPOINT_REQUESTS.md §B. Гражданин просматривает собственную PKI через панель RP (например, «Моя система» на template.gerege.mn): сертификаты и их количество, история и счётчики активности в рамках RP, связанные устройства, итоги для панели.

Приватность — только специально авторизованные RP

Эти эндпойнты возвращают персональные данные гражданина, поэтому они НЕ ОТКРЫТЫ для всех RP. Вызывающий RP должен обладать разрешением PKI_READ, которое администратор выдаёт каждому RP индивидуально (консоль администратора → Доверяющая сторона (RP) → редактировать RP → флажок «PKI_READ»). Неавторизованный RP → 403.

  • first-party (собственное web/admin-демо оператора) и dev ("") — разрешены всегда.
  • Активность ограничена рамками RP: RP видит только созданные им сессии (входы/подписания других RP не раскрываются).

Аутентификация: как и в v3, Authorization: Bearer <rp_sk_…>.

Эндпойнты (все требуют разрешения PKI_READ)

GET /v3/certificates/etsi/{personEtsi}

Полный набор сертификатов гражданина + счётчики по статусам.

{
  "personEtsi": "PNOMN-...",
  "counts": { "valid": 2, "revoked": 1, "expired": 0, "suspended": 1, "total": 4 },
  "certificates": [
    { "documentNumber":"…", "type":"AUTH|SIGN|SEAL", "serialNumber":"…",
      "certificateLevel":"ADVANCED|QUALIFIED|QSCD",
      "status":"VALID|REVOKED|EXPIRED|SUSPENDED",
      "notBefore":"RFC3339", "notAfter":"RFC3339", "issuerDn":"…" }
  ]
}
Отображение статусов: certificates.status ACTIVE→(EXPIRED, если notAfter уже прошёл, иначе VALID), SUPERSEDED→SUSPENDED, REVOKED→REVOKED.

GET /v3/devices/etsi/{personEtsi}

Связанные устройства гражданина (активные + неактивные).

{
  "personEtsi":"PNOMN-...", "activeCount":1, "total":2,
  "devices":[ { "documentNumber":"…", "platform":"APNS|FCM",
                "enrolledAt":"RFC3339", "active":true, "deactivatedAt":null } ]
}

GET /v3/rp/activity/etsi/{personEtsi} — в рамках RP

История и счётчики только тех сессий, которые создал вызывающий RP. Параметры запроса: ?flow=AUTHENTICATION|SIGNATURE&limit=20&offset=0

{
  "personEtsi":"PNOMN-...",
  "counts": { "authentication": 42, "signature": 7 },
  "sessions": [ { "sessionId":"…", "flow":"AUTHENTICATION", "outcome":"OK",
                  "docText":"…", "timestamp":"RFC3339" } ],
  "total": 49, "limit": 20, "offset": 0
}
Источник: audit_events (SESSION_AUTH/SESSION_SIGN, сохраняются между перезапусками). Ограничение по RP выполняется фильтрацией по полю crp в деталях аудита (UUID RP-создателя).

GET /v3/person/summary/etsi/{personEtsi} — итоги для панели

Сводные итоги панели (одним вызовом).

{
  "personEtsi":"PNOMN-...", "givenName":"…", "surname":"…",
  "certificates": { "valid":2, "revoked":1, "expired":0, "suspended":1, "total":4 },
  "activity": { "authentication":42, "signature":7 },
  "devicesActive":1, "devicesTotal":2,
  "representationCount":1
}

Well-known

GET /.well-known/eidendpoints.person.{certificates,devices,activity,summary} (помечены как PKI_READ).

Реализация

  • Сервис: service.PersonPKIService (server/internal/service/memory/person.go).
  • Обработчики: server/internal/httpapi/handlers_person.go (rpAuth + проверка requirePKIRead).
  • Разрешение: PKI_READ в CSV-поле RP.Permissions (флажок в форме RP в консоли администратора).
  • Несуществующий гражданин → 404; неавторизованный RP → 403; отсутствует Bearer → 401 (RequireRPAuth).