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 |
|---|---|---|
|
| 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: D2000Vlastnosť | Popis |
|---|---|
| Identifikátor realmu, ktorý klient posiela v poli |
| OAuth2 token endpoint nadradeného IdP |
| Prihlasovacie údaje dôverného klienta zaregistrované v IdP |
| Medzerou oddelený zoznam OAuth2 scopov |
|
|
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 IdPSpustenie proxy
java -jar smartweb-proxy.jar \
--spring.config.location=file:/opt/smartweb-proxy/config/application.yamlPlný 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: trueKľúčové vlastnosti
Vlastnosť | Popis |
|---|---|
| Context root, pod ktorým proxy obsluhuje všetky cesty (login, gateway routy, cookies) |
| Truststore pre výstupné HTTPS na IdP a backend SmartWeb |
| Hex 32-bajtový AES-GCM kľúč na šifrovanie cookie refresh kontextu |
| Názov Spring Security OAuth2 client registrácie, ktorá riadi OAuth2 tok |
| Prihlasovacie údaje OAuth2 klienta (client ID/secret, grant type, scopy) |
| Discovery URL IdP (automaticky zistí |
| Gateway routy — preposielajú na backend SmartWeb, frontend službu atď. Filter |
| 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).