Konfigurácia OAuth2 a SmartWeb Proxy

Konfigurácia OAuth2 a SmartWeb Proxy

V SmartWeb platforme existujú dve nasadenia súvisiace s OAuth2:

  • OAuth2 token endpoint — REST endpoint zabudovaný v hlavnom SmartWeb procese, ktorý vymení D2000 prihlasovacie údaje za OAuth2 access / refresh token od nadradeného poskytovateľa identít (Keycloak, Azure AD, …). Užitočné pre natívne aplikácie, ktoré sa už autentifikujú voči D2000, ale potrebujú volať nadradené API chránené OAuth2.

  • SmartWeb Proxy — samostatný proces Spring Cloud Gateway nasadený pred hlavným SmartWebom. Vykonáva OAuth2 Authorization Code flow s IdP v mene prehliadača, drží OAuth2 tokeny na strane servera v šifrovanej cookie a do každej preposlanej požiadavky vkladá bearer token. Prehliadač OAuth2 tokeny nikdy nevidí.

[!NOTE] Hlavný SmartWeb proces prichádzajúce OAuth2 JWT bearer tokeny na API požiadavkách (/api/rest/**, /api/odata/**, /api/open/**, gRPC) neoveruje — server-to-server klienti sa autentifikujú API kľúčom (X-API-Key) alebo HTTP Basic autentifikáciou. Prihlásenie používateľa z prehliadača cez externého poskytovateľa identít (OIDC/IAM) rieši režim AUTH_OIDC_LOCALLY. Oboje je popísané v Konfigurácia autentifikácie.

OAuth2 token endpoint

Cesta vystavenia: /api/oauth2 (zabezpečené rovnako ako server-to-server REST API — API kľúč, JWT alebo Basic auth).

Metóda

Cesta

Popis

Metóda

Cesta

Popis

POST

/api/oauth2/v0/oauth2/token

Výmena D2000 prihlasovacích údajov za nadradený OAuth2 token

Požiadavka

{ "username": "operator1", "password": "secret", "realm": "my-keycloak-realm", "scope": "openid profile" }

Úspešná odpoveď

Plná token odpoveď z nadradeného IdP je preposlaná tak ako je (RFC 6749):

{ "access_token": "eyJhbGciOiJSUzI1NiIsInR5...", "token_type": "Bearer", "expires_in": 3600, "refresh_token": "abc123...", "scope": "openid profile" }

Chybová odpoveď

{ "error": "invalid_grant", "error_description": "Invalid D2000 credentials" }

Konfigurácia

smartweb: authentication: oauth2: realms: - name: "my-keycloak-realm" tokenUrl: "https://keycloak.example.com/realms/my-realm/protocol/openid-connect/token" clientId: "smartweb-client" clientSecret: "client-secret-value" scope: "openid profile" authMode: D2000 # D2000 | EXTERNAL - name: "azure-ad" tokenUrl: "https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token" clientId: "app-client-id" clientSecret: "app-secret" scope: "https://graph.microsoft.com/.default" authMode: D2000

Vlastnosť

Popis

Vlastnosť

Popis

name

Identifikátor realmu, ktorý klient posiela v poli realm token požiadavky

tokenUrl

OAuth2 token endpoint nadradeného IdP

clientId / clientSecret

Prihlasovacie údaje dôverného klienta zaregistrované v IdP

scope

Medzerou oddelený zoznam OAuth2 scopov

authMode

D2000 — prihlasovacie údaje predložené volajúcim sa najprv overia voči D2000; EXTERNAL — údaje sa odovzdajú priamo IdP bez lokálneho overenia

SmartWeb Proxy

SmartWeb Proxy je samostatná Spring Boot aplikácia zabalená ako smartweb-proxy.jar. Beží pred hlavnou inštanciou SmartWebu a vystupuje ako dôverný OAuth2 klient (token-mediating backend). Relácie (session) prehliadača nesú len šifrovanú cookie obsahujúcu OAuth2 refresh kontext; access a refresh tokeny nikdy neopustia server.

Prehliadač → SmartWeb Proxy → SmartWeb (web-jar) → D2000 └── OAuth2 Authorization Code + Refresh toky s IdP

Spustenie proxy

java -jar smartweb-proxy.jar \ --spring.config.location=file:/opt/smartweb-proxy/config/application.yaml

Plný príklad konfigurácie (/opt/smartweb-proxy/config/application.yaml)

# Context root proxy (zároveň základná cesta pre cookies a presmerovania) spring.webflux.base-path: /edc-mobile # Truststore pre výstupné TLS spojenia na IdP a backend SmartWeb javax.net.ssl.trustStore: ./config/truststore.jks smartweb: proxy: auth: # Cookie-based autentifikácia pre token-mediating backend vystavený na # {spring.webflux.base-path}/auth/token token-mediating-backend: enabled: true persistence-cookie: name: REMEMBER_ME_COOKIE domain: localhost path: "${spring.webflux.base-path:}/login" ttl: 30D secure: false same-site: Strict # AES-GCM symetrický šifrovací kľúč pre cookie refresh kontextu (hex, 32 bajtov) encryption-secret: 6698ccc5a0469f58ff1e12de02eff22792968678dfca597e709fb34bd67d81ce encryption-salt: f40173ec5eed0e0346621f32a3a774dc auth-success-redirect-uri: "${spring.webflux.base-path:}/index.html" client-registration-id: edc-web-mobile-client spring: application: name: smartweb-proxy security: oauth2: # OAuth2 resource server pre endpointy /api/** resourceserver: jwt: issuer-uri: https://iam-test-edc.okte.sk/auth/realms/edc-external # OAuth2 klient pre endpoint token-mediating-backend client: registration: edc-web-mobile-client: provider: edc-web-mobile-provider client-id: edc-core-ui client-secret: V4gwRiLcv4RP9zj2BJ1oAzMLS3kFhpMu authorization-grant-type: authorization_code # Pre dlhožijúce relácie pridajte "offline_access" scope: openid,profile,offline_access provider: edc-web-mobile-provider: issuer-uri: https://iam-test-edc.okte.sk/auth/realms/edc-external cloud: # Kam posielať preposlané požiadavky. Viacero inštancií umožní round-robin rozloženie záťaže. discovery: client: simple: instances: smartweb-frontend-service: - uri: http://localhost:5173 smartweb-backend-service: - uri: http://localhost:80/edccore # Routy Spring Cloud Gateway gateway: server: webflux: routes: - id: api uri: lb://smartweb-backend-service predicates: - Path=/api/** filters: - UsernameHeader # pridá X-SmartWeb-User z OAuth2 principalu - RemoveRequestHeader=Authorization - SetRequestHeader=X-Api-Key, <smartweb-api-key> - RewritePath=/edc-mobile/?(?<segment>.*), /edccore/$\{segment} - id: swagger uri: lb://smartweb-backend-service/ predicates: - Path=/swagger/** filters: - RewritePath=/edc-mobile/?(?<segment>.*), /edccore/$\{segment} - id: resources uri: lb://smartweb-frontend-service/ predicates: - Path=/** metrics: enabled: true loadbalancer: eager-load: clients: - smartweb-backend-service - smartweb-frontend-service health-check: enabled: false smartweb-backend-service: - path: /do.healthcheck?format=simple interval: 5s refetch-instances: true smartweb-frontend-service: - path: / interval: 5s refetch-instances: true

Kľúčové vlastnosti

Vlastnosť

Popis

Vlastnosť

Popis

spring.webflux.base-path

Context root, pod ktorým proxy obsluhuje všetky cesty (login, gateway routy, cookies)

javax.net.ssl.trustStore

Truststore pre výstupné HTTPS na IdP a backend SmartWeb

smartweb.proxy.auth.token-mediating-backend.persistence-cookie.encryption-secret

Hex 32-bajtový AES-GCM kľúč na šifrovanie cookie refresh kontextu

smartweb.proxy.auth.token-mediating-backend.client-registration-id

Názov Spring Security OAuth2 client registrácie, ktorá riadi OAuth2 tok

spring.security.oauth2.client.registration.<id>

Prihlasovacie údaje OAuth2 klienta (client ID/secret, grant type, scopy)

spring.security.oauth2.client.provider.<id>.issuer-uri

Discovery URL IdP (automaticky zistí token_endpoint, jwks_uri, …)

spring.cloud.gateway.server.webflux.routes

Gateway routy — preposielajú na backend SmartWeb, frontend službu atď. Filter UsernameHeader vloží autentifikovaného používateľa do hlavičky (predvolene X-SmartWeb-User).

spring.cloud.discovery.client.simple.instances

Statický register služieb — pre produkčné multi-inštančné nasadenia nahraďte skutočným discovery serverom

[!NOTE] Proxy je samostatný proces oddelený od hlavného smartweb.jar. Musí byť nasadený a prevádzkovaný nezávisle — typicky na inom hoste alebo v inom kontajneri. Backend SmartWeb musí proxy dôverovať: definujte API kľúč, ktorý gateway vkladá cez filter SetRequestHeader=X-Api-Key, ... (viď Konfigurácia autentifikácie).