Панель 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":"…" }
]
}
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/eid → endpoints.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).