Агуулгыг алгасах

Архитектур

Платформ нь Clean Architecture зарчмаар бүтээгдсэн: handler → usecase → repository → domain. Business core нь web framework-ийг import хийдэггүй.

Бүрэлдэхүүн

Internet ──► nginx (TLS)
   ├─ /oauth2/*, /.well-known/*, /userinfo ─► Go API — өөрийн OIDC issuer
   ├─ /rp/sign/*   ─► eID sign relay (backend)
   ├─ /rp/eid/*     ─► eID service proxy — хувь хүн (backend)
   ├─ /rp/eid-org/* ─► eID service proxy — байгууллага (backend)
   └─ бусад бүх       ─► Next.js BFF (web) ──► backend API (:8080)
   internal network:  db (PostgreSQL) · redis

Давхаргууд

Давхарга Технологи Тайлбар
Backend Go · chi (net/http) · pgx (ORM-гүй) Clean Architecture, RLS, hand-written SQL
Frontend Next.js 15 (BFF) Браузер зөвхөн ижил-origin route-той харилцана; токен client JS-д гардаггүй
OIDC provider Өөрийн Go код (usecases/oidc) login/consent/logout урсгалыг платформ өөрөө жолоодоно
Identity eID Mongolia RP Цахим үнэмлэхээр баталгаажуулалт
Cache/queue Redis session deny-list, transient state
AI Gemini (SDK-гүй REST) чат, дуу хоолой, орчуулга

Аюулгүй байдал

  • Row-Level Security (RLS) — хэрэглэгч бүр зөвхөн өөрийн мөрийг хардаг; boot-үеийн мөрдөлтийн guard (production-д non-superuser role шаардана).
  • BFF загвар — токен httpOnly cookie-д, браузерийн JS-д хэзээ ч гардаггүй.
  • Давхар CSRF — custom header + origin шалгалт.
  • Security headers — CSP, HSTS, COOP/COEP/CORP; per-IP rate limiting.
  • Аудит — hash-chain холбоост, зөвхөн-нэмэх бүртгэл.

Backend бүтэц (тойм)

backend/
├── cmd/api/server/        # manual DI wiring (server.go)
├── internal/
│   ├── business/
│   │   ├── domain/         # цэвэр домэйн (import-гүй)
│   │   └── usecases/       # бизнес логик (interface-д хамааралтай)
│   ├── datasources/
│   │   ├── repositories/   # pgx adapter + interface
│   │   └── caches/         # redis
│   └── http/
│       ├── handlers/       # func(w,r) error, v1.Wrap
│       ├── middlewares/    # auth, oauth-bearer, rate-limit, ...
│       └── routes/         # route группировка
├── pkg/                    # eid, oidc, secrethash, gemini, ...
└── migrations/             # numbered SQL (N_name.up/down.sql)