Oracle ERP Cloud Authentication Patterns

Type: ERP Integration System: Oracle ERP Cloud (Fusion Cloud Applications) (Release 25B) Confidence: 0.88 Sources: 7 Verified: 2026-03-09 Freshness: 2026-03-09

TL;DR

System Profile

Oracle ERP Cloud (Fusion Cloud Applications) centralizes all authentication through OCI IAM identity domains (the successor to Oracle Identity Cloud Service / IDCS). Every Fusion Cloud environment comes with a pre-provisioned identity domain where Fusion Applications are auto-registered as resource applications. Third-party systems must be registered as confidential client applications. This card covers the detailed implementation patterns for each authentication flow. For a high-level overview of which method to choose, see the prerequisite card (oracle-erp-cloud-authentication).

PropertyValue
VendorOracle
SystemOracle ERP Cloud (Fusion Cloud Applications) Release 25B
API SurfaceREST, SOAP
Current API VersionRelease 25B (quarterly: 25A, 25B, 25C, 25D)
Editions CoveredAll Oracle Fusion Cloud editions
DeploymentCloud
API DocsOracle Fusion Cloud OAuth Configuration
StatusGA

API Surfaces & Capabilities

Oracle Fusion Cloud exposes multiple API surfaces. Authentication applies uniformly -- the same OAuth token works for REST, SOAP, and UCM endpoints. The token's scope and the integration user's Fusion roles determine which operations are permitted.

API SurfaceProtocolBest ForAuth MethodsToken TypeReal-time?Bulk?
REST API (v2)HTTPS/JSONIndividual record CRUD, queriesOAuth 2.0, JWT, Basic AuthBearerYesNo
SOAP APIHTTPS/XMLWeb service operations, ERP Integration ServiceOAuth 2.0, JWT, Basic Auth, SAMLSAML/BearerYesVia ERP Integration Service
UCM (WebCenter Content)HTTPSFBDI file upload, report retrievalOAuth 2.0, Basic AuthBearerNoYes
BI PublisherHTTPS/SOAPScheduled extracts, custom reportsOAuth 2.0, Basic AuthBearerNoYes
Business EventsHTTPS/JSONOutbound event notificationsOAuth 2.0 (subscriber-side)BearerYesN/A

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
Max request body size~10 MB (varies)REST APILarger payloads via UCM/FBDI
Max concurrent requestsNot published (fair-use)All API surfacesAdaptive throttling per tenant/pod
Session timeout (default)8 hours (28,800s)All sessionsConfigurable in identity domain settings
Token request rateNot publishedOAuth token endpointExcessive requests trigger 429
FBDI file size limit250 MBFile-Based Data ImportSplit larger files

Rolling / Daily Limits

Limit TypeValueWindowEdition Differences
API call rate limitNot published (fair-use)RollingAdaptive throttling; no fixed cap
Burst throttleHTTP 429 on excessive callsPer-minuteBack off exponentially
Token endpoint rateFair-use throttlingPer-minuteCache tokens to avoid limits
FBDI/ESS jobsSubject to ESS queuePer-tenantShared with scheduled processes

Authentication

Detailed implementation patterns for each Oracle ERP Cloud authentication flow.

FlowGrant TypeUse WhenToken LifetimeRefresh?Security Level
Client Credentials (2-legged)client_credentialsServer-to-server, no user contextAccess: 1h; Refresh: 7dYes (with offline_access)High
JWT Assertionurn:ietf:params:oauth:grant-type:jwt-bearerServer-to-server, certificate trustAccess: 1h (configurable)New JWT per requestHighest
Authorization Code (3-legged)authorization_codeUser-context operationsAccess: 1h; Refresh: 7dYesHigh
Resource Owner PasswordpasswordLegacy, testing onlyAccess: 1hNoLow
SAML 2.0 Bearer Assertionurn:ietf:params:oauth:grant-type:saml2-bearerCross-domain identity propagationAccess: 1hNoHigh
Basic AuthenticationN/A (HTTP header)Quick testing onlySession timeout (8h)N/ALowest

Pattern 1: Client Credentials (2-Legged OAuth)

Most common pattern for server-to-server integrations. The confidential application authenticates using its client ID and client secret. All API calls execute under the integration user's identity. [src1]

Pattern 2: JWT Assertion (Certificate-Based)

Most secure pattern for machine-to-machine. Instead of a shared client secret, the application signs a JWT with a private key. The public certificate is uploaded to the confidential application. [src2]

Pattern 3: Authorization Code (3-Legged OAuth)

Used when the application needs to act on behalf of a specific user. Requires interactive browser-based authentication. Not suitable for unattended batch processing. [src1]

Pattern 4: SAML 2.0 Federation for SSO

Enables browser-based Single Sign-On with external Identity Providers (Azure AD, Okta, ADFS, PingFederate). Applies only to interactive browser-based authentication -- API-level OAuth flows bypass federation entirely. [src6, src7]

IdPProtocolUser ProvisioningNotes
Microsoft Entra ID (Azure AD)SAML 2.0Manual or SCIMDownload Entra SAML metadata; configure as IdP
OktaSAML 2.0SCIM (automatic)Okta as IdP, identity domain as SP
PingFederateSAML 2.0ManualExport PingFederate metadata
ADFSSAML 2.0Manual or DirSyncExport ADFS federation metadata XML
Any SAML 2.0 IdPSAML 2.0ManualUpload IdP metadata document

Pattern 5: Identity Propagation Through Middleware

Flows end-user identity through OIC or other middleware to Fusion Cloud for audit and security purposes. Uses OAuth JWT User Assertion security policy. [src3]

Pattern 6: External IdP Token Exchange (Azure AD)

Exchange Azure AD tokens for Oracle access tokens without requiring users to re-authenticate against the Oracle identity domain. [src7]

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- Choosing an Oracle ERP Cloud authentication pattern
|-- What type of client?
|   |-- Server/backend (unattended)
|   |   |-- Can you manage certificates and PKI lifecycle?
|   |   |   |-- YES --> Pattern 2: JWT Assertion (most secure)
|   |   |   |-- NO --> Pattern 1: Client Credentials
|   |   |-- Need user-level audit trail?
|   |       |-- YES --> Pattern 5: Identity Propagation
|   |       |-- NO --> Pattern 1: Client Credentials
|   |-- Browser-based (user-interactive)
|   |   |-- Users have existing corporate IdP credentials?
|   |   |   |-- YES, Azure AD --> Pattern 6: Token Exchange
|   |   |   |-- YES, Okta/ADFS --> Pattern 4: SAML + Pattern 3
|   |   |   |-- NO --> Pattern 3: Authorization Code
|   |-- Middleware (OIC, MuleSoft, Boomi)
|   |   |-- OIC within same identity domain?
|   |   |   |-- YES --> OAuth auto-configured
|   |   |   |-- NO --> Manual registration + Pattern 1 or 2
|   |   |-- Need identity propagation?
|   |       |-- YES --> Pattern 5
|   |       |-- NO --> Pattern 1
|   |-- Quick test / debugging
|       |-- Basic Auth (dev/test only, never production)
|-- LBAC enabled?
|   |-- YES --> Allowlist IPs FIRST
|   |-- NO --> Proceed
|-- Multi-environment?
    |-- YES --> Separate app registration per environment
    |-- NO --> Single registration

Quick Reference

OAuth 2.0 Grant Types Comparison

Grant TypeClient Secret RequiredUser InteractionRefresh TokenMFA CompatibleProduction Ready
Client CredentialsYesNoYes (with offline_access)N/AYes
JWT AssertionNo (certificate)NoNo (new JWT per request)N/AYes (recommended)
Authorization CodeYesYes (browser)YesYesYes
Authorization Code + PKCENo (code verifier)Yes (browser)YesYesYes
Resource Owner PasswordYesNoNoNoNo (legacy)
SAML Bearer AssertionYesNoNoDepends on IdPYes (specialized)

Token Endpoint Reference

EndpointURL PatternPurpose
Token (IDCS-migrated)https://<tenant>.identity.oraclecloud.com/oauth2/v1/tokenApps in OracleIdentityCloudService domain
Token (Default domain)https://<region>.identity.oraclecloud.com/oauth2/v1/tokenApps in Default identity domain
Authorizehttps://<domain>.identity.oraclecloud.com/oauth2/v1/authorizeAuthorization Code flow
JWKShttps://<domain>.identity.oraclecloud.com/admin/v1/SigningCert/jwkToken validation / public keys
Userinfohttps://<domain>.identity.oraclecloud.com/oauth2/v1/userinfoAuthenticated user claims
OpenID Discoveryhttps://<domain>.identity.oraclecloud.com/.well-known/openid-configurationAuto-discovery of all endpoints
SAML Metadatahttps://<domain>.identity.oraclecloud.com/fed/v1/metadataSP metadata for SAML federation

Step-by-Step Integration Guide

1. Register a Confidential Application in OCI IAM

Create the OAuth client that all patterns depend on. Navigate to OCI Console > Identity & Security > Domains > Applications > Add Application > Confidential Application. Configure grant types, scopes, and activate. [src1]

Verify: Applications list shows Status: Active.

2. Obtain Client Credentials Token

Exchange client credentials for an access token (Pattern 1). [src1, src4]

curl -X POST \
  "https://<tenant>.identity.oraclecloud.com/oauth2/v1/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -u "<CLIENT_ID>:<CLIENT_SECRET>" \
  -d "grant_type=client_credentials&scope=urn:opc:resource:consumer::all"

Verify: Response contains "token_type": "Bearer" and "expires_in": 3600.

3. Generate and Use JWT Assertion

Create a signed JWT and exchange for access token (Pattern 2). [src2]

# Generate key pair (one-time)
openssl genrsa -out private_key.pem 4096
openssl req -new -x509 -key private_key.pem -out public_cert.pem -days 730

# Upload public_cert.pem to confidential app > Certificates tab

# Exchange signed JWT for access token
curl -X POST \
  "https://<tenant>.identity.oraclecloud.com/oauth2/v1/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=<SIGNED_JWT>&scope=urn:opc:resource:consumer::all"

Verify: Response contains "access_token" without sending any client secret.

4. Configure SAML 2.0 Federation

Set up SSO with an external Identity Provider (Pattern 4). Navigate to Identity Providers in your identity domain, upload IdP metadata, configure NameID mapping. [src6, src7]

Verify: User can access Fusion Cloud via IdP login without Oracle credentials.

5. Implement Token Caching and Refresh

Prevent excessive token requests for long-running integrations. [src5]

Verify: Multiple calls within token lifetime return cached token without endpoint hit.

6. Set Up Identity Propagation

Configure middleware to flow end-user identity to Fusion Cloud for audit trail compliance. [src3]

Verify: Fusion Cloud audit trail shows end user's username, not integration service account.

Code Examples

Python: JWT Assertion with Certificate-Based Auth

# Input:  Private key PEM file, Client ID, Token endpoint
# Output: Access token via JWT assertion (no shared secret)

import time
import jwt  # PyJWT>=2.8.0
import requests  # requests>=2.31.0

def get_oracle_token_jwt(token_url, client_id, private_key_path):
    with open(private_key_path, "r") as f:
        private_key = f.read()
    now = int(time.time())
    claims = {
        "iss": client_id, "sub": client_id,
        "aud": token_url, "iat": now, "exp": now + 300,
    }
    signed_jwt = jwt.encode(claims, private_key, algorithm="RS256")
    resp = requests.post(token_url, data={
        "grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
        "assertion": signed_jwt,
        "scope": "urn:opc:resource:consumer::all",
    }, headers={"Content-Type": "application/x-www-form-urlencoded"}, timeout=30)
    resp.raise_for_status()
    return resp.json()["access_token"]

JavaScript/Node.js: Authorization Code with PKCE

// Input:  Client ID, Redirect URI, endpoints
// Output: Access token via authorization code + PKCE

import crypto from "crypto";

function generatePKCE() {
  const verifier = crypto.randomBytes(32).toString("base64url");
  const challenge = crypto.createHash("sha256")
    .update(verifier).digest("base64url");
  return { verifier, challenge };
}

async function exchangeCodeForToken(tokenEndpoint, clientId,
    clientSecret, code, redirectUri, codeVerifier) {
  const credentials = Buffer.from(
    `${clientId}:${clientSecret}`).toString("base64");
  const resp = await fetch(tokenEndpoint, {
    method: "POST",
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
      Authorization: `Basic ${credentials}`,
    },
    body: new URLSearchParams({
      grant_type: "authorization_code", code,
      redirect_uri: redirectUri, code_verifier: codeVerifier,
    }),
  });
  if (!resp.ok) throw new Error(`Failed: ${resp.status}`);
  return resp.json();
}

cURL: Test Each Authentication Pattern

# Pattern 1: Client Credentials
curl -X POST \
  "https://<tenant>.identity.oraclecloud.com/oauth2/v1/token" \
  -u "<CLIENT_ID>:<CLIENT_SECRET>" \
  -d "grant_type=client_credentials&scope=urn:opc:resource:consumer::all"

# Pattern 2: JWT Assertion
curl -X POST \
  "https://<tenant>.identity.oraclecloud.com/oauth2/v1/token" \
  -d "grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=<JWT>&scope=urn:opc:resource:consumer::all"

# Verify token against Fusion Cloud
curl "https://<erp-host>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" -w "\nHTTP: %{http_code}\n"

Data Mapping

Authentication Configuration Mapping

Configuration ElementOCI IAM LocationFormatRequired ForGotcha
Client IDConfidential App > GeneralUUID stringAll OAuth flowsMust be from the correct identity domain
Client SecretConfidential App > GeneralStringClient Creds, Auth CodeRotate every 90 days; store in vault
Token endpoint URLDomain > OverviewURLAll OAuth flowsVaries between IDCS-migrated and Default domains
Redirect URIConfidential App > Client ConfigURLAuthorization Code onlyMust match exactly (including trailing slash)
Certificate (PEM)Confidential App > CertificatesPEM fileJWT Assertion onlyUpload full chain for production
ScopeConfidential App > ResourcesURN stringAll OAuth flowsurn:opc:resource:consumer::all or specific
SAML MetadataSecurity > Identity ProvidersXML fileSAML Federation onlyDownload fresh from IdP before setup

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
400Invalid token requestWrong grant_type, missing scope, inactive app, malformed JWTVerify grant type enabled; check scope URN; ensure app Active
401Unauthorized / LBAC blockExpired token, wrong creds, LBAC blockingCheck token expiry; verify LBAC allowlist
403Insufficient permissionsIntegration user lacks Fusion rolesAssign required application roles
429Rate throttledExcessive API or token requestsExponential backoff; cache tokens
invalid_grantJWT assertion rejectedExpired JWT, clock skew >5min, wrong audSync clocks; verify aud = token endpoint
invalid_clientClient auth failedWrong ID/secret, inactive app, cert mismatchVerify credentials; check certificate chain
invalid_scopeScope not allowedScope not configured on appAdd scope in app resource config
unauthorized_clientGrant type not enabledApp missing requested grant typeEnable grant type in app settings

Failure Points in Production

Anti-Patterns

Wrong: Using Basic Auth for production integrations

# BAD -- credentials in every request, exposed in logs
response = requests.get(url, auth=("user", "P@ssw0rd"))

Correct: Use OAuth 2.0 with vault-stored credentials

# GOOD -- token-based, credentials from vault, token cached
token = token_mgr.get_token()
response = requests.get(url, headers={"Authorization": f"Bearer {token}"})

Wrong: Requesting a new token for every API call

# BAD -- 1000 invoices = 1000 token requests (200-500ms each)
for inv_id in ids:
    token = get_fresh_token(...)
    requests.get(f"{base}/invoices/{inv_id}", headers={"Authorization": f"Bearer {token}"})

Correct: Cache token and reuse until near expiry

# GOOD -- one token per hour, reused across all calls
token_mgr = OracleTokenManager(...)
for inv_id in ids:
    token = token_mgr.get_token()  # cached or refreshes if <60s left
    requests.get(f"{base}/invoices/{inv_id}", headers={"Authorization": f"Bearer {token}"})

Wrong: Hardcoding token endpoint URLs

# BAD -- breaks on IDCS migration or domain changes
TOKEN_URL = "https://idcs-abc123.identity.oraclecloud.com/oauth2/v1/token"

Correct: Use OpenID Discovery for endpoint resolution

# GOOD -- resilient to endpoint changes
disco = requests.get(f"{domain}/.well-known/openid-configuration").json()
TOKEN_URL = disco["token_endpoint"]

Wrong: Sharing one certificate across all environments

# BAD -- compromised dev cert exposes production

Correct: Separate certificates per environment

# GOOD -- each environment has own key pair
# prod: CA-signed, 2-year | test/dev: self-signed, 1-year
openssl genrsa -out prod_key.pem 4096
openssl req -new -x509 -key prod_key.pem -out prod_cert.pem -days 730

Common Pitfalls

Diagnostic Commands

# Discover all identity domain endpoints
curl -s "https://<domain>.identity.oraclecloud.com/.well-known/openid-configuration" | python3 -m json.tool

# Test Client Credentials token request
curl -v -X POST "https://<domain>.identity.oraclecloud.com/oauth2/v1/token" \
  -u "<CLIENT_ID>:<CLIENT_SECRET>" \
  -d "grant_type=client_credentials&scope=urn:opc:resource:consumer::all"

# Decode JWT payload (inspect without verification)
echo "<TOKEN>" | cut -d'.' -f2 | base64 -d 2>/dev/null | python3 -m json.tool

# Verify token against Fusion Cloud
curl -w "\nHTTP: %{http_code}\n" \
  "https://<erp-host>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest" \
  -H "Authorization: Bearer <TOKEN>"

# Check certificate expiry
openssl x509 -in cert.pem -noout -enddate

# Test LBAC (compare from two IPs)
curl -s -o /dev/null -w "%{http_code}" "https://<erp-host>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest" \
  -H "Authorization: Bearer <TOKEN>"

Version History & Compatibility

ReleaseDateStatusBreaking ChangesMigration Notes
OCI IAM Identity Domains GA2022-02CurrentIDCS console moved to OCI ConsoleAll IDCS APIs, client IDs, tokens continue to work
IDCS-to-IAM Region Migration2023-03 to 2024-06CompleteAutomatic migrationNo code changes required
Identity Domain Replication2024-08CurrentNoneCross-region DR available
Fusion Cloud Release 25A2025-01CurrentNone auth-relatedQuarterly release; endpoints unchanged
Fusion Cloud Release 25B2025-04CurrentNone auth-relatedOAuth config UI improvements
OCI IAM OAuth 2.1 AlignmentPlanned 2025-2026UpcomingPassword grant likely deprecatedMigrate off password grant proactively

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Implementing specific OAuth grant type flowsNeed high-level auth method overviewOracle ERP Cloud Authentication
Setting up SAML federation with external IdPsNeed Oracle NetSuite auth (TBA/OAuth)NetSuite TBA vs OAuth 2.0
Configuring identity propagation through middlewareNeed general OAuth 2.0 patternssoftware/patterns/oauth2-client-credentials/2026
Managing certificate lifecycle for JWT flowsNeed Salesforce OAuth authSalesforce OAuth Authentication
Multi-environment auth strategy (prod/test/dev)Need Oracle ERP REST API capabilitiesOracle ERP Cloud REST API

Important Caveats

Related Units