Migration from Oracle OAM / API Platform
This guide covers migration from Oracle Access Manager (OAM), Oracle Identity Manager (OIM), and Oracle API Platform to STOA Platform.
What You Haveβ
Typical Oracle stack:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β CURRENT STATE β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Oracle Access Manager (OAM) β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β WebGate β β OAM β β Access β β β
β β β Agents β β Server β β Policies β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Oracle Identity Manager (OIM) β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β User β β Workflow β β Entitle- β β β
β β β Store β β Engine β β ments β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Oracle API Platform (optional) β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β API β β Developerβ β Analyticsβ β β
β β β Gateway β β Portal β β β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Pain points: β
β β’ Rigid claims structure β hard to customize tokens β
β β’ Limited modern auth support (no native OIDC federation) β
β β’ Organizations often seek alternatives for cost optimization β
β β’ Complex administration requiring specialized expertise β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
What STOA Providesβ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β WITH STOA β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β STOA Control Plane (Cloud) β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β β β Portal β β Config β β Keycloak β β β
β β β Catalog β β API β β (OIDC) β β β
β β ββββββββββββ ββββββββββββ ββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β federates with (not replaces) β
β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Oracle OAM/OIM (On-Prem) β β
β β Remains master IdP β β
β β Keycloak federates for token flexibility β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Benefits: β
β β’ Keep Oracle as master identity store β
β β’ Add OIDC/OAuth2 flexibility via Keycloak β
β β’ Token Exchange (RFC 8693) for service-to-service β
β β’ Self-service API subscriptions β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Migration Pathβ
Phase 1: Keycloak Federation with OAMβ
Goal: Establish Keycloak as OIDC layer over OAM
Architectureβ
ββββββββββββββ ββββββββββββββ ββββββββββββββ
β Consumer ββββββΆβ Keycloak ββββββΆβ Oracle β
β β β (Federated)β β OAM/OIM β
ββββββββββββββ ββββββββββββββ ββββββββββββββ
β β
β Token Exchange
β (RFC 8693)
βΌ β
ββββββββββββββ β
β STOA βββββββββββββ
β Gateway β
ββββββββββββββ
Configurationβ
-
Create Keycloak Identity Provider for OAM
{
"alias": "oracle-oam",
"providerId": "oidc",
"enabled": true,
"config": {
"issuer": "https://oam.corp.local/oauth2",
"authorizationUrl": "https://oam.corp.local/oauth2/authorize",
"tokenUrl": "https://oam.corp.local/oauth2/token",
"userInfoUrl": "https://oam.corp.local/oauth2/userinfo",
"clientId": "keycloak-federation",
"clientSecret": "${OAM_CLIENT_SECRET}",
"defaultScope": "openid profile email",
"syncMode": "IMPORT"
}
} -
Configure User Attribute Mapping
Map OAM attributes to Keycloak claims:
{
"mappers": [
{
"name": "employee-id",
"protocol": "openid-connect",
"protocolMapper": "oidc-usermodel-attribute-mapper",
"config": {
"user.attribute": "employeeId",
"claim.name": "employee_id",
"jsonType.label": "String"
}
},
{
"name": "department",
"protocol": "openid-connect",
"protocolMapper": "oidc-usermodel-attribute-mapper",
"config": {
"user.attribute": "department",
"claim.name": "department",
"jsonType.label": "String"
}
}
]
} -
Enable Token Exchange
# Enable token exchange in Keycloak
/opt/keycloak/bin/kcadm.sh update realms/stoa \
-s 'attributes.token-exchange-enabled=true'
Phase 2: API Registrationβ
Goal: Import Oracle API Platform definitions to STOA
-
Export from Oracle API Platform
# Export API definitions
curl -X GET "https://oracle-apip/apiplatform/management/v1/apis" \
-H "Authorization: Bearer $TOKEN" \
-o oracle-apis.json -
Transform to OpenAPI
# Use STOA CLI to convert
stoa api convert --input oracle-apis.json \
--format oracle --output openapi-apis.json -
Import to STOA
stoa api import --file openapi-apis.json
Phase 3: Policy Migrationβ
Goal: Translate Oracle policies to STOA format
Policy Mappingβ
| Oracle OAM Policy | STOA Equivalent |
|---|---|
| Authentication Policy | Keycloak Client Policy |
| Authorization Policy | STOA Authorization Policy |
| Session Policy | Keycloak Session Settings |
| Token Policy | Keycloak Token Settings |
| Resource Protection | STOA Route Policy |
Example: Authorization Policyβ
Oracle OAM:
<AuthorizationPolicy name="api-access">
<Resource>/api/v1/*</Resource>
<Rule>
<Condition>group=api-consumers</Condition>
<Effect>ALLOW</Effect>
</Rule>
</AuthorizationPolicy>
STOA equivalent:
apiVersion: policy.stoa.io/v1
kind: AuthorizationPolicy
metadata:
name: api-access
spec:
rules:
- to:
- operation:
paths: ["/api/v1/*"]
from:
- source:
principals: ["group:api-consumers"]
Phase 4: Traffic Migrationβ
Goal: Route traffic through STOA with OAM authentication
-
Configure STOA to validate OAM tokens (via Keycloak)
apiVersion: security.stoa.io/v1
kind: JWTValidator
metadata:
name: oam-jwt
spec:
issuer: https://keycloak.stoa.cloud/realms/stoa
jwksUri: https://keycloak.stoa.cloud/realms/stoa/protocol/openid-connect/certs
audiences:
- stoa-gateway
claimMappings:
sub: user_id
employee_id: employee_id
department: department -
Shadow Traffic Testing
apiVersion: networking.stoa.io/v1
kind: TrafficShadow
metadata:
name: oam-shadow
spec:
source:
idp: oracle-oam
target:
idp: keycloak-federated
percentage: 100
mode: readonly -
Gradual Cutover
apiVersion: networking.stoa.io/v1
kind: TrafficSplit
metadata:
name: oam-migration
spec:
routes:
- authentication: oracle-oam-direct
weight: 50
- authentication: keycloak-federated
weight: 50
Oracle-Specific Considerationsβ
What Stays with Oracleβ
| Component | Recommendation |
|---|---|
| OIM User Store | Keep as master |
| OIM Workflows | Keep for provisioning |
| OAM WebGate | Remove when fully migrated |
| OAM Policies | Migrate to Keycloak/STOA |
What Moves to STOA/Keycloakβ
| Component | Destination |
|---|---|
| OAuth/OIDC | Keycloak |
| API Gateway | STOA Gateway |
| Developer Portal | STOA Portal |
| Analytics | STOA + Grafana |
Token Format Changesβ
| Attribute | Oracle OAM | Keycloak/STOA |
|---|---|---|
| Token Format | OAM proprietary | JWT (RFC 7519) |
| Claims | Limited, rigid | Flexible, customizable |
| Lifetime | OAM session | Configurable per client |
| Refresh | Complex | Standard refresh_token |
Claims Flexibilityβ
One of the main pain points with OAM is rigid claims structure. With Keycloak:
// Custom claim mapper (JavaScript)
token.setOtherClaims("custom_permissions",
user.getAttributes().get("permissions").toString());
token.setOtherClaims("api_tier",
user.getGroups().stream()
.filter(g => g.getName().startsWith("api-tier-"))
.findFirst()
.map(g => g.getName().replace("api-tier-", ""))
.orElse("basic"));
Handling OAM Sessionsβ
Session Synchronizationβ
To maintain session consistency during migration:
apiVersion: session.stoa.io/v1
kind: SessionSync
metadata:
name: oam-keycloak-sync
spec:
source:
type: oracle-oam
sessionCookie: OAM_JSESSIONID
target:
type: keycloak
sessionCookie: KC_SESSION
synchronization:
enabled: true
direction: bidirectional
Single Logoutβ
Configure OIDC back-channel logout:
apiVersion: security.stoa.io/v1
kind: LogoutConfig
metadata:
name: federated-logout
spec:
backChannelLogout:
enabled: true
url: https://oam.corp.local/oam/logout
frontChannelLogout:
enabled: true
redirectUri: https://portal.corp.local/logged-out
Rollback Procedureβ
Oracle OAM remains fully operational throughout migration:
# Immediate rollback
kubectl apply -f oam-direct-routing.yaml
# Verify OAM is handling auth
curl -I https://api.corp.local/health \
-H "Authorization: Bearer $OAM_TOKEN"
Success Criteriaβ
| Metric | Target |
|---|---|
| Federation | Keycloak β OAM working |
| Token Exchange | RFC 8693 operational |
| SSO | Single sign-on preserved |
| API Migration | 100% registered in STOA |
| User Experience | No disruption to end users |
Next Stepsβ
- IBM webMethods Migration β If you also have webMethods
- Hybrid Deployment β Architecture options
- Security & Compliance β DORA/NIS2 considerations
Need migration assistance? Contact us for professional services.