RP дэд систем (subsystem)¶
Нэг RP-ийн доор олон дэд систем. RP-г зөвхөн админ бүртгэдэг; дэд системийг RP-даа итгэж авто-бүртгэдэг (find-or-create). Утасны consent дэлгэцэд дэд системийн нэрийг ТОМ, эцэг RP-ийн нэрийг доор ЖИЖГЭЭР харуулна.
Wire (гол санаа)¶
RP дуудлагадаа шинэ талбар нэмэхгүй — body-гийн relyingPartyName-г дэд системийн нэр болгон
дахин ашиглана. Бүртгэлтэй RP-ийн хувьд энэ талбар өмнө нь rp.Name-ээр дарагдаж, ач холбогдолгүй
болсон байсан (impersonation хаалт). Одоо:
Сервер (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; AndroidSessionInfo+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-г доор ЖИЖГЭЭР баталгаажуулна.