Aller au contenu principal

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​

  1. 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"
    }
    }
  2. 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"
    }
    }
    ]
    }
  3. 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

  1. 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
  2. Transform to OpenAPI

    # Use STOA CLI to convert
    stoa api convert --input oracle-apis.json \
    --format oracle --output openapi-apis.json
  3. 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 PolicySTOA Equivalent
Authentication PolicyKeycloak Client Policy
Authorization PolicySTOA Authorization Policy
Session PolicyKeycloak Session Settings
Token PolicyKeycloak Token Settings
Resource ProtectionSTOA 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

  1. 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
  2. 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
  3. 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​

ComponentRecommendation
OIM User StoreKeep as master
OIM WorkflowsKeep for provisioning
OAM WebGateRemove when fully migrated
OAM PoliciesMigrate to Keycloak/STOA

What Moves to STOA/Keycloak​

ComponentDestination
OAuth/OIDCKeycloak
API GatewaySTOA Gateway
Developer PortalSTOA Portal
AnalyticsSTOA + Grafana

Token Format Changes​

AttributeOracle OAMKeycloak/STOA
Token FormatOAM proprietaryJWT (RFC 7519)
ClaimsLimited, rigidFlexible, customizable
LifetimeOAM sessionConfigurable per client
RefreshComplexStandard 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​

MetricTarget
FederationKeycloak ↔ OAM working
Token ExchangeRFC 8693 operational
SSOSingle sign-on preserved
API Migration100% registered in STOA
User ExperienceNo disruption to end users

Next Steps​


Need migration assistance? Contact us for professional services.