Saltar a contenido

RP дэд систем (subsystem)

Нэг RP-ийн доор олон дэд систем. RP-г зөвхөн админ бүртгэдэг; дэд системийг RP-даа итгэж авто-бүртгэдэг (find-or-create). Утасны consent дэлгэцэд дэд системийн нэрийг ТОМ, эцэг RP-ийн нэрийг доор ЖИЖГЭЭР харуулна.

Wire (гол санаа)

RP дуудлагадаа шинэ талбар нэмэхгүй — body-гийн relyingPartyName-г дэд системийн нэр болгон дахин ашиглана. Бүртгэлтэй RP-ийн хувьд энэ талбар өмнө нь rp.Name-ээр дарагдаж, ач холбогдолгүй болсон байсан (impersonation хаалт). Одоо:

POST /v3/auth/... { "relyingPartyUUID": "<RP UUID>", "relyingPartyName": "Хаан Банк Зээл" }

Сервер (newSession, store.go): 1. RP-г secret (Bearer)-ээс таьна (CreatorRP) — body-гийн UUID-д итгэхгүй. 2. relyingPartyName-г тухайн RP доторх дэд систем болгон resolveSubsystem-ээр find-or-create. Түлхүүр = lower(trim(name)) (name_key), RP тус бүрд unique. 3. Session-д: RPName = rp.Name (authoritative, жижиг мөр), SubsystemName (том мөр), SubsystemID.

relyingPartyName хоосон эсвэл RP-тэй ижил нэр илгээвэл → default дэд систем (RP-тэй ижил нэр). Хуучин RP-үүд (ж: web demo "Demo Bank") өөрийн нэрийг илгээдэг тул шууд default-руу таарна — backward-compatible.

first-party (оператор) / dev ("") дуудагчид дэд систем байхгүй (RP бүртгэлгүй) — SubsystemName хоосон, утас зөвхөн RPName-ийг ганцаар харуулна.

Бүртгэл ба хамгаалалт

  • RP бүртгэгдэхэд өөртэйгөө ижил нэртэй default дэд систем заавал үүснэ (Register).
  • Cap: RP тус бүр SMARTID_RP_SUBSYSTEM_MAX (default 50) дэд системтэй. Хэтэрвэл шинэ авто- үүсгэлтийг татгалзана (ErrSubsystemCap → HTTP 429). Одоо байгаа дэд систем хэвээр ажиллана.
  • Админ дэд системийг зөвхөн засварлана: нэр солих / нэгтгэх (merge) / идэвхгүйжүүлэх. Шинээр гараар үүсгэхгүй (RP авто-үүсгэнэ).

Тоолуур

Дэд систем мөрөнд auth_count / sign_count / last_used_at — session амжилттай (OK) дуусах бүрд атомаар нэмэгдэнэ (recordSessionActivity, crypto_wired.go). RP-ийн нийт тоо = дэд системүүдийн SUM. Admin dashboard-д "Дэд систем (идэвхтэй/нийт)" + RP жагсаалт дотор per-subsystem тоолуур.

Endpoint (admin, /v3/admin/*)

Method Зам Тайлбар
GET relying-parties/{id}/subsystems RP-ийн дэд систем + тоолуур (rp:read)
PATCH relying-parties/{id}/subsystems/{sid} нэр солих (rp:write)
POST relying-parties/{id}/subsystems/{sid}/deactivate | /activate идэвхтэй төлөв
POST relying-parties/{id}/subsystems/{sid}/merge {targetId} src→dst тоолуур нэгтгэх

Файл

  • DB: server/migrations/V30__rp_subsystems.sql (+ хуучин RP-д default backfill).
  • Модель/repo: persistence/models.go (Subsystem, session-д SubsystemID/Name), repo/repo.go (Subsystems), repo/inmem, repo/pg, postgres/subsystem_repo.go.
  • Логик: service/memory/store.go (resolveSubsystem, admin ops), crypto_wired.go (тоолуур).
  • Утас: iOS SessionInfo.subsystemName + ContentView/RequestView; Android SessionInfo + RequestView.kt — дэд систем ТОМ, RP доор ЖИЖГЭЭР (нэр ижил бол зөвхөн RP).
  • Админ: admin/src/app/(app)/rps/page.tsx (дэд систем дэлгэх + удирдлага), page.tsx (dashboard).

Аюулгүйн тэмдэглэл

Дэд системийн нэр RP-ийн өгсөн free-text (RP "Google" гэх мэт нэр өгч болзошгүй). Хамгаалалт: (а) дэд систем RP-д scoped; (б) авторитет RP нэр доор ЖИЖГЭЭР үргэлж харагдана; (в) cap + admin merge/rename/deactivate. Энэ нь "RP-даа итгэнэ" загвартай нийцнэ.

push мэдэгдэл нь дэд системийн нэрийг үндсэн болгож харуулна (<дэд систем> (<RP>) — RP-ээс өөр нэртэй үед); хоосон бол RP. apns.go body + payload-д subsystemName. Утас нээгдэхэд sessionInfo-оос consent дэлгэц дэд системийг ТОМ, RP-г доор ЖИЖГЭЭР баталгаажуулна.