Sari la conținut

GSSO — Consumatori și contractul cu consumatorii

Acest conținut nu este încă disponibil în limba selectată.

Cod documentSPEC-GSSO-2026 / Raportul 03
Versiune0.1-draft (sursa EN, text care prevalează)
Data2026-10-05
StatutProiect
Rapoarte însoțitoare00 RFP · 01 ADR · 02 Cerințe · 04 Documentație tehnică · 05 Foaie de parcurs
VersiuneDataModificări
0.1-draft2026-10-05Inventarul consumatorilor (așa cum a fost constatat la 2026-10-05), realm-ul/clientul/rolul țintă per aplicație, căile de migrare, contractul API/evenimente/starter, lista de verificare pentru conectare
ModelDescriereProblemă
A — autentificare dublă cu emitere de token-urioauth2Login față de Keycloak, apoi OidcAppTokenSuccessHandler emite propriul JWT HS512 al aplicației (copiind ROLE_*) și îl returnează SPA-ului prin /oidc-callback#id_token=. Autentificarea locală admin/admin încă funcționeazăCheie de semnare și parole locale; fără deconectare SSO; revocarea în Keycloak nu are efect; două surse de identitate
B — resource serverAplicația validează token-urile RS256 ale Keycloak prin issuer/JWKS; SPA-ul folosește PKCE sau OAuth2 JHipsterCorect, dar fiecare aplicație are propriul cod și propria mapare a rolurilor
C — JWT local (+ MPass SAML)Utilizatori și parole proprii; MPass prin SAML direct în aplicațieFără SSO cu gStack
D — proiectat, neconstruitAplicațiile conform playbook-ului: gateway BFF + microservicii cu OAuth2 prin GSSONecesită CAP-GSSO-01..07

Ținta pentru toți: GSSO-ADR-009. Aceasta înseamnă un gateway/BFF sau un resource server prin gsso-spring-boot-starter, un SPA prin @gstack/gsso-angular și nicio parolă locală sau token emis local.

Realm-ul interdictii este realm-ul partajat actual. „Ținta” se referă la realm-ul gstack, dacă nu se precizează altfel.

AplicațieTipAstăzi (realm / client / model)Clienți țintăRoluri țintă (exemple)Note de migrareFază
saas_interdictiiSaaSinterdictii / interdictii-web confidential / A (patch manual necomis, JHipster 8.11 jwt)interdictii-web (confidential, BFF) sau interdictii-spa (PKCE) + interdictii-api (bearer)INTERDICTII_ADMIN, INTERDICTII_EMITENT, INTERDICTII_APROBATOR, INTERDICTII_CONSULTANT, INTERDICTII_AUDITORSe înlocuiește OidcAppTokenSuccessHandler cu resource server prin starter; se renunță la parolele locale; RolUser ADMIN/EMITENT se mapează la roluri; API-ul public de consultare → clienți de serviciu pentru bănci/ANAF într-un realm tenant- sau gstackS4
cancelarieSaaSinterdictii / cancelarie confidential / B (JHipster oauth2, provizionare proprie în identity/)cancelarie (confidential), cancelarie-apiCANCELARIA_REGISTRATOR, _SEF, _EXECUTOR, _CONTROLOR, _AUDITOR, _ADMINProcesul de integrare a angajaților apelează cererile de atribuire din api/v1/app (GSSO-FR-051) în locul admiterii locale; realm-ul local de dezvoltare jhipster este înlocuit de stiva compose GSSOS4
gregistrySaaSinterdictii / gregistry-web public PKCE / B (ADR-002)aceiași identificatori, mutați în gstackGREGISTRY_ADMIN, GREGISTRY_OPERATORPilot al starter-ului (deja model B); păstrează deconectarea doar locală până când se dorește single logoutS3
gdocsSaaSgdocs (profilul oidc) / gdocs-web / Agdocs-web, gdocs-api, gdocs-serviceGDOCS_ADMIN, GDOCS_EDITOR, GDOCS_CITITORLa fel ca interdictii; realm-ul gdocs este retrasS4
saas_drumuriSaaSJWT local + MPass SAML în aplicație / mediul frontend indică greșit către glog-web / Cpersonal: drumuri-web în gstack; cetățeni: drumuri-public în cetateanDRUMURI_ADMIN, DRUMURI_OPERATOR, DRUMURI_INSPECTORMPass se mută din aplicație în brokerul cetatean; mediul frontend se corectează imediat (identificator de client greșit); gazdă separată routes.tech.esempla.systems → URI-uri de redirecționareS4
saas_crmSaaSdoar design / Dcrm-gateway (confidential), câte un client de serviciu per microserviciu (crm-core, crm-clienti, crm-comercial, crm-interactiuni, crm-suport, crm-contracte, crm-operational, crm-taskuri, crm-strategie, crm-integrare, crm-cautare, crm-ai), crm-integration-1cCRM_* (din raportul CRM 02)CAP-GSSO-01 este blocant pentru CRM F0; token exchange către gDocFlow/gTenders (CAP-GSSO-07)S1–S3
saas_gdocflowSaaSdesign / Dgdocflow-gateway, clienți de serviciuGDOCFLOW_*Țintă și sursă de token exchangeS3
saas_gtendersSaaSdesign / Dgtenders-gateway, clienți de serviciuGTENDERS_*Token exchangeS3
saas_gnotifySaaS/PaaSrealm-ul gnotify (necreat) / OIDC dezactivat / A; folosește client credentials ale clientului glog-ingestgnotify-web, gnotify-serviceGNOTIFY_ADMIN, GNOTIFY_OPERATOR; scope-ul notify:send pentru apelanțiActivare prin starter; GSSO folosește GNotify prin scope-ul gnotify-serviceS4
glogPaaSinterdictii / glog-web PKCE (mapper tenant=demo codificat fix) + serviciul glog-ingest / B (profilul dualauth)glog-web, glog-api, clienți de ingestie per apelant (<app>-glog)GLOG_ADMIN, GLOG_AUDITOR; client scopes audit:write, audit:readSe înlocuiește maparea rol→scope din GlogJwtAuthConverter cu starter-ul + scope-uri explicite; claim-ul tenant provine din mapper-ul GSSO; GSSO însuși devine client de ingestieS3
paas_gstoragePaaSrealm-ul gstorage / gstorage-web, gstorage-ingest; alternativă cu cheie APIgstorage-web, gstorage-api, clienți de serviciu <app>-gstorageGSTORAGE_ADMIN, GSTORAGE_ARCHIVIST; scope-urile `storage:readwriteadmin`
paas_gflowPaaSdesign / Dgflow-gateway, gflow-server, principali de serviciu per aplicație (<app>-gflow)GFLOW_ADMIN; grupuri candidate = rolurile consumatorilorFolosește GET /api/v1/app/roluri/{cod}/utilizatori (GSSO-FR-103); fără token exchangeS3
gportal / GDSPaaSfără autentificare (mock-uri)gportal-web (PKCE)ROLE_USERFolosește @gstack/gsso-angularS4
platform (docs/RAG)interninterdictii / gstack-platform PKCE; Python PyJWT + JWKS, necesită ROLE_ADMINgstack-platformPLATFORM_ADMINVerificarea rolului se schimbă din ROLE_ADMIN în PLATFORM_ADMINS4
gsso_mob (GovSign)mobilrealm-ul gstack / gstack-govsign-app public PKCE, redirecționare com.govsign.app://callback; aprobare QR per sitegovsign-app (public PKCE) în gstack și cetateanROLE_USERSe elimină KEYCLOAK_CLIENT_SECRET din configurația clientului public; autentificarea QR ca authenticator Keycloak (GSSO-FR-068)S5
Site-uri whitelabel (ultra-b2b, ultra-ecom, bts-licitatii, bts-integrare, esempla-govstec, esempla-sistembancar)site-urirealm-urile ultra / gstack-ultra (neconfirmat)câte un realm tenant-<code> pentru fiecare, din șablonper siteCreate prin GSSO din șablon; endpoint-ul de aprobare QR se păstrează până la GSSO-FR-068S4
qa_platforminstrumentniciunul (doar credențialele țintei)client de serviciu qa-runner per mediuQA_RUNNERUtilizatorii de test sunt creați prin API-ul GSSO în realm-uri de neproducțieS5

2.1 Rețeta de migrare pentru o aplicație cu modelul A

Section titled “2.1 Rețeta de migrare pentru o aplicație cu modelul A”
  1. Se înregistrează platforma, clienții și rolurile în GSSO sau se adoptă din interdictii (GSSO-FR-007).
  2. Se creează atribuiri care reproduc deținătorii actuali ai rolurilor (AtribuireAcces cu sursa ADOPTAT).
  3. Se adaugă gsso-spring-boot-starter. Pentru perioada de tranziție se setează gsso.issuer-uri, gsso.audience și gsso.role-aliases (de exemplu ROLE_ADMIN: INTERDICTII_ADMIN).
  4. Se elimină handler-ul de emitere a token-urilor, secretul JWT local, autentificarea locală cu parolă și ruta /oidc-callback. Pentru un SPA de monolit, se trece la @gstack/gsso-angular în modul BFF sau PKCE.
  5. Se rulează testele E2E ale aplicației față de stiva compose GSSO, apoi se implementează în spatele unui feature flag care păstrează clientul vechi în paralel pentru o versiune.
  6. Se elimină role-aliases și maparea depreciată ROLE_ADMIN, apoi se șterge clientul vechi.

Calea de bază: https://gsso.gstack.esempla.systems/api/v1 (prin gsso-gateway).

Convenții:

  • JSON, erori RFC 7807;
  • Idempotency-Key pe fiecare POST;
  • paginare cu page, size, sort și X-Total-Count în răspuns;
  • denumiri de câmpuri de domeniu în limba română.

3.1 Zona app — aplicațiile consumatoare (client credentials, scope-ul gsso:app)

Section titled “3.1 Zona app — aplicațiile consumatoare (client credentials, scope-ul gsso:app)”
MetodăCaleScopCer.
GET/app/platformapropria platformă, cu clienții și rolurileFR-098
PUT/app/platformaautoînregistrarea / actualizarea propriei platforme, a clienților și a rolurilor (doar clienții marcați)FR-099
GET/app/utilizatori?sub=&username=&email=&idnp=căutare (IDNP doar dacă este permis)FR-100
GET/app/utilizatori/{sub}statut (activ, MFA, ultima autentificare), nume, e-mail, unitate organizațională, limbăFR-101
GET/app/utilizatori/{sub}/rolurirolurile efective ale platformei apelante, cu limitări și valabilitateFR-101
DELETE/app/utilizatori/{sub}/sesiuniîncheierea sesiunilor utilizatoruluiFR-102
GET/app/roluri/{cod}/utilizatoriutilizatorii care dețin un rol al platformei apelante (paginat)FR-103
POST/app/atribuirisolicitarea unei atribuiri pentru un utilizator pe platforma apelantă ({sub, rol, orgUnit?, validPana?, motiv}) → SOLICITATAFR-051
GET/app/atribuiri/{id}statutul atribuiriiFR-051

3.2 Zona admin — consola (sesiunea utilizatorului prin gsso-gateway)

Section titled “3.2 Zona admin — consola (sesiunea utilizatorului prin gsso-gateway)”

Acestea sunt resursele; specificația OpenAPI completă se află la /api/v1/openapi.json:

  • /admin/realms, /admin/realms/{realm}/adoptie, /admin/realms/{realm}/reconciliere
  • /admin/platforme, /admin/platforme/{cod}/clienti, /admin/platforme/{cod}/roluri
  • /admin/clienti/{id}/secret (rotire)
  • /admin/realms/{realm}/utilizatori, …/{sub}, …/{sub}/credentiale, …/{sub}/sesiuni, …/{sub}/actiuni (acțiuni obligatorii), …/{sub}/deblocare
  • /admin/atribuiri (cu /{id}/aprobare, /{id}/respingere, /{id}/revocare)
  • /admin/unitati
  • /admin/realms/{realm}/politica-autentificare
  • /admin/sincronizare/joburi (cu /{id}/reincercare, /{id}/acceptare-drift)
  • /admin/evenimente, /admin/evenimente/verificare-lant
  • /admin/tablou (agregatele tabloului de bord)
  • /admin/rapoarte/acces

/health/live, /health/ready, /metrics, /info, /api/v1/openapi.json.

3.4 Contractul token-ului (realm-ul gstack)

Section titled “3.4 Contractul token-ului (realm-ul gstack)”
ClaimConținutNote
isshttps://sso.gstack.esempla.systems/realms/gstack
subUUID, stabilGSSO-FR-032
audaudiența (audiențele) platformei țintămapper de audiență per platformă
azpidentificatorul clientului
preferred_username, name, emailprofil
roleslistă plată a rolurilor de realm efective (prefixate cu platforma) + ROLE_USERfiltrată per audiență cu scope-ul gsso-roles-filtered
roles_scoped{ "<ROLE>": ["<org_unit>", …] } doar pentru atribuirile limitateGSSO-FR-055
org_unit, org_unit_pathunitatea organizațională a utilizatoruluiGSSO-FR-054
localero / ru / en
idnpdoar cu client scope-ul opțional idnpQ-GSSO-13
acr1 / 2 / 3GSSO-FR-070
act{ "sub": "<calling client>" } pe token-urile obținute prin exchangeGSSO-ADR-012
tenantcodul realm-ului pentru realm-urile tenant-* (înlocuiește mapper-ul codificat fix din glog)

Durata de viață a token-ului de acces: 5 min (2 min pentru clienții sensibili). Semnătură: RS256, cu cheile publicate la /protocol/openid-connect/certs.

<dependency>
<groupId>systems.esempla.gsso</groupId>
<artifactId>gsso-spring-boot-starter</artifactId>
</dependency>
# application.yml of a consuming service
gsso:
issuer-uri: https://sso.gstack.esempla.systems/realms/gstack
audience: crm
role-aliases: # transition only (report 03 §2.1)
ROLE_ADMIN: CRM_ADMIN
client: # optional: outgoing calls
id: crm-comercial
secret: ${GSSO_CLIENT_SECRET}
revocation:
kafka-topic: gsso.access-revoked.v1 # deny-list, GSSO-ADR-013
@PreAuthorize("hasAuthority('CRM_ADMIN')")
public void delete(...) { ... }
GssoPrincipal p = GssoPrincipal.current(); // sub, username, orgUnit, locale
RestClient docs = gsso.exchangeClient("gdocflow"); // token exchange (on-behalf-of)
RestClient glog = gsso.serviceClient("glog"); // client credentials

Angular:

provideGsso({ mode: 'bff', loginUrl: '/oauth2/authorization/oidc', logoutUrl: '/api/logout' })
// or { mode: 'pkce', issuer, clientId }
// route guard: canActivate: [gssoRole('CRM_ADMIN')]
// template: <button *gssoHasRole="'CRM_ADMIN'">…</button>

Toate evenimentele sunt CloudEvents în mod binar pe Kafka, cu source = gsso și subject = <realm>/<sub>.

TopicProducătorTipPayload (data)Consumatori
gsso.kc-events.v1Extensia Keycloak gsso-kafkamd.gstack.gsso.kc.user.<TYPE> / md.gstack.gsso.kc.admin.<OPERATION>câmpurile evenimentului Keycloak (tip, realm, client, utilizator, ip, eroare, detalii / tipul resursei, cale, reprezentare fără secrete)doar gsso
gsso.access-revoked.v1gssomd.gstack.gsso.access.revoked{sub, realm, roluri[], platforme[], notBefore, motiv}starter-ul din fiecare aplicație
gsso.user-changed.v1gssomd.gstack.gsso.user.changed{sub, realm, campuri[], enabled}aplicațiile care păstrează în cache datele utilizatorilor
gsso.grant.v1gssomd.gstack.gsso.grant.<STARE>{id, sub, rol, platforma, orgUnit, validDe, validPana, stare}aplicațiile care oglindesc permisiunile (de ex. gFlow)

Cheia = <realm>:<sub>. Livrarea este at-least-once, așadar consumatorii trebuie să fie idempotenți după id. Fiecare grup de consumatori are un topic DLQ <topic>.dlq.<group>.

ObiectConvențieExemplu
Codul platformeilitere mici, [a-z][a-z0-9-]*crm, interdictii, glog
Rol<PLATFORM_UPPER>_<ROLE> (cratimele devin _)CRM_ADMIN, INTERDICTII_EMITENT
Client SPA<platform>-web (PKCE) sau <platform>-gateway (BFF)glog-web, crm-gateway
Client backend<platform>-api (bearer-only)cancelarie-api
Client de serviciu<service> sau <caller>-<callee>crm-comercial, gnotify-glog
Client scope (serviciu)<platform>:<verb> sau <object>:<verb>audit:write, storage:read
Realm de tenanttenant-<code>tenant-ultra-b2b
Audiențăcodul platformeicrm
ElementValoare implicită
Limita de rată a API-ului app50 cereri/s per client, vârf (burst) 100
Autoînregistraremaximum 20 de clienți și 200 de roluri per platformă
Cereri de atribuire din partea aplicațiilor1 000 / zi per platformă
Disponibilitate oferităKeycloak 99,9 %, consolă/API 99,5 % (NFR-AVL)
Suportechipa platformei, în orele de lucru; indisponibilitatea Keycloak = P1
Versionareapi/v1 stabil; o modificare incompatibilă = v2, cu 6 luni de funcționare în paralel

8. Lista de verificare pentru conectarea unei aplicații noi

Section titled “8. Lista de verificare pentru conectarea unei aplicații noi”
  1. Proprietarul platformei este desemnat; codul platformei este ales (§6).
  2. Rolurile sunt enumerate cu descrieri în RO/RU/EN; rolurile sensibile sunt marcate; rolurile compozite sunt definite.
  3. Clienții sunt declarați: tipul de acces, URI-urile de redirecționare (exacte), originile web, URL-ul de deconectare back-channel.
  4. Clienții de serviciu sunt declarați per serviciu apelant, cu scope-uri; țintele de token exchange sunt enumerate, dacă este necesar.
  5. Platforma este înregistrată în GSSO (consolă sau PUT /api/v1/app/platforma), iar statutul ei de sincronizare este sincronizat.
  6. Aplicația folosește gsso-spring-boot-starter (și @gstack/gsso-angular). Nu există parole locale și nici token-uri emise local.
  7. Validarea audienței este activă. Autorizarea folosește doar rolurile platformei.
  8. Aplicația este abonată la gsso.access-revoked.v1 (prin starter).
  9. Atribuirile inițiale sunt solicitate și aprobate; utilizatorii de test există în realm-urile de neproducție.
  10. CSP-ul permite sso.gstack.esempla.systems în connect-src și form-action.
  11. Testul E2E de autentificare trece față de stiva compose GSSO. Sonda matricei de autorizare (/gtestgen) trece.
  12. Aplicația este adăugată în §2 al prezentului raport și în raportul de acces.