Oracle ERP Cloud Authentication

Type: ERP Integration System: Oracle ERP Cloud (Fusion Cloud Applications) (Release 25A) Confidence: 0.88 Sources: 8 Verified: 2026-03-01 Freshness: 2026-03-01

TL;DR

System Profile

Oracle ERP Cloud (officially "Oracle Fusion Cloud Applications") is Oracle's cloud-native ERP suite covering financials, procurement, project management, supply chain, and HCM. Authentication is handled centrally through OCI IAM identity domains (formerly Oracle Identity Cloud Service / IDCS). All Fusion Cloud Applications are auto-registered as resource applications in the identity domain, and any third-party integrating system must be registered as a confidential client application. [src1]

This card covers authentication for all Oracle Fusion Cloud REST and SOAP APIs across all editions. It does not cover Oracle NetSuite (which uses Token-Based Authentication / TBA) or Oracle E-Business Suite on-premise (which uses Oracle Access Manager). [src2]

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

API Surfaces & Capabilities

Oracle ERP Cloud exposes multiple API surfaces for integration. Authentication applies uniformly across all. [src2, src3]

API SurfaceProtocolBest ForAuth MethodsReal-time?Bulk?
REST APIHTTPS/JSONIndividual record CRUD, queries, business object operationsBasic Auth, OAuth 2.0, JWTYesLimited (via FBDI)
SOAP APIHTTPS/XMLWeb service operations, ERP integration events, legacyBasic Auth, OAuth 2.0, JWTYesVia ERP Integration Service
FBDI (File-Based Data Import)HTTPS + UCMHigh-volume batch imports (journals, invoices, POs)OAuth 2.0 (via UCM upload)NoYes
BI Publisher ReportsHTTPS/SOAPScheduled extracts, report generationBasic Auth, OAuth 2.0NoYes

Rate Limits & Quotas

Per-Request Limits

Limit TypeValueApplies ToNotes
Max request body sizeVaries by endpointREST APITypically 10 MB; larger payloads via UCM/FBDI
Max concurrent requestsVaries by pod/tenantAll API surfacesNo fixed published limit; adaptive throttling
Session timeout (default)8 hours (28,800s)All sessionsConfigurable in identity domain settings
FBDI file size limit250 MBFile-Based Data ImportSplit larger files into multiple batches

Rolling / Daily Limits

Limit TypeValueWindowEdition Differences
API call rate limitNot published (fair-use)RollingOracle uses adaptive throttling; no fixed daily cap
Burst throttleHTTP 429 on excessive callsPer-minuteBack off exponentially when receiving 429
FBDI jobsSubject to ESS queuePer-tenantShared with other scheduled processes
[src3, src8]

Authentication

Oracle ERP Cloud supports four authentication methods for API access. OAuth 2.0 is recommended; Basic Auth remains available but should be avoided for production. [src1, src2]

FlowUse WhenToken LifetimeRefresh?Notes
OAuth 2.0 Client Credentials (2-legged)Server-to-server, no user contextAccess: 1h (configurable); Refresh: 7dYes (with offline_access scope)Recommended for integrations [src1]
OAuth 2.0 Authorization Code (3-legged)User-context operations, interactiveAccess: 1h; Refresh: 7dYesRequires interactive login [src2]
OAuth 2.0 Resource Owner (Password)Highly trusted environments onlyAccess: 1hNoAvoid in production; no MFA support [src3]
JWT Assertion (Bearer Token)Server-to-server with certificate trustAccess: 1h (configurable)New JWT per requestMost secure for M2M [src4]
Basic AuthenticationQuick testing, legacy onlySession timeout (8h default)N/AHigh credential leakage risk [src3]

Token Lifetime Configuration

Access token expiry is MIN(configured_expiry, remaining_session_lifetime). Default session lifetime is 8h (28,800s). Configuring a longer token expiry has no effect beyond the session boundary. [src5]

IDCS to OCI IAM Migration

Oracle migrated all IDCS instances to OCI IAM identity domains (Feb 2022 -- mid 2024). Existing OAuth configurations, client IDs, and certificates continue to work. Admin console moved to OCI Console > Identity & Security > Domains. [src7]

Federation with External Identity Providers

IdPProtocolUser ProvisioningNotes
Microsoft Entra ID (Azure AD)SAML 2.0Manual or SCIMDownload Entra SAML metadata; configure as IdP in OCI IAM
OktaSAML 2.0SCIM (automatic)Okta as IdP, OCI IAM identity domain as SP
Any SAML 2.0-compliant IdPSAML 2.0ManualUpload IdP metadata document to OCI IAM

Federation affects interactive (browser-based) authentication only. API-level OAuth flows operate independently. [src7]

Authentication Gotchas

Constraints

Integration Pattern Decision Tree

START -- Authenticating with Oracle ERP Cloud
|-- What type of integration?
|   |-- Server-to-server (unattended, scheduled, middleware)
|   |   |-- Can you manage certificates?
|   |   |   |-- YES --> JWT Assertion flow (most secure, no shared secrets)
|   |   |   |-- NO --> OAuth 2.0 Client Credentials (simpler setup)
|   |   |-- Need to act as a specific user?
|   |       |-- YES --> Client Credentials + service user mapping
|   |       |-- NO --> Client Credentials with integration user
|   |-- User-initiated (interactive, delegated access)
|   |   |-- Browser-based UI?
|   |   |   |-- YES --> OAuth 2.0 Authorization Code (3-legged)
|   |   |   |-- NO --> Not recommended; use server-side proxy
|   |   |-- Need SSO with corporate IdP?
|   |       |-- YES --> SAML 2.0 federation + Authorization Code flow
|   |       |-- NO --> Authorization Code with identity domain login
|   |-- Quick test / debugging
|       |-- YES --> Basic Auth (dev/test only, never production)
|       |-- NO --> Use OAuth 2.0
|-- Using Oracle Integration Cloud (OIC)?
|   |-- YES --> OAuth configured automatically via Fusion Apps identity domain
|   |-- NO --> Manual confidential app registration required
|-- LBAC enabled on Fusion Apps?
    |-- YES --> Allowlist integration platform NAT Gateway IPs FIRST
    |-- NO --> Proceed with auth setup

Quick Reference

OAuth 2.0 Token Endpoints

EndpointURL PatternNotes
Token (IDCS-migrated domain)https://<tenant>.identity.oraclecloud.com/oauth2/v1/tokenFor apps in OracleIdentityCloudService domain
Token (Default domain)https://<region>.identity.oraclecloud.com/oauth2/v1/tokenFor apps in the Default identity domain
Authorize (3-legged)https://<tenant>.identity.oraclecloud.com/oauth2/v1/authorizeAuthorization Code flow only
JWKS (public keys)https://<tenant>.identity.oraclecloud.com/admin/v1/SigningCert/jwkFor token validation
Userinfohttps://<tenant>.identity.oraclecloud.com/oauth2/v1/userinfoReturns authenticated user claims

Confidential App Registration Checklist

StepActionWhere
1Navigate to Identity DomainOCI Console > Identity & Security > Domains
2Add Confidential ApplicationApplications > Add Application
3Configure grant typesClient Credentials, Authorization Code, JWT Assertion (as needed)
4Set allowed scopesAdd Oracle Fusion Apps resource scopes
5Upload certificate (JWT only)Application > Certificates tab
6Note Client ID and Client SecretRequired for token requests
7Activate the applicationMust be Active to issue tokens
[src1, src2]

Step-by-Step Integration Guide

1. Register a Confidential Application in OCI IAM

Create the OAuth client that will authenticate with Oracle ERP Cloud. [src1]

  1. Log in to OCI Console > Identity & Security > Domains
  2. Select the appropriate identity domain (usually "OracleIdentityCloudService")
  3. Click Applications > Add Application > Confidential Application
  4. Name the application (e.g., "ERP Integration Client")
  5. Under Client Configuration, select the grant types you need
  6. Under Resources, add Oracle Fusion Cloud Applications as an allowed scope
  7. Record the Client ID and Client Secret
  8. Click Activate

Verify: In the Applications list, confirm Status: Active.

2. Obtain an Access Token (Client Credentials)

Exchange client credentials for an access token. [src1, src3]

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. Obtain an Access Token (JWT Assertion)

Use a signed JWT to request a token without sharing a client secret. [src4]

# Generate JWT with claims: iss=CLIENT_ID, sub=CLIENT_ID,
# aud=token_endpoint, exp=now+300, iat=now. Sign with RS256.

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 "token_type": "Bearer". No client secret transmitted.

4. Call an Oracle ERP Cloud REST API

Use the access token to invoke any Fusion Cloud REST endpoint. [src3]

curl -X GET \
  "https://<erp-host>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/invoices" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -H "Content-Type: application/json"

Verify: HTTP 200 with JSON payload. If 401, check token expiry and LBAC allowlisting.

5. Implement Token Refresh

For long-running integrations, refresh the token before expiry. [src5]

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=refresh_token&refresh_token=<REFRESH_TOKEN>"

Verify: New access_token and refresh_token in response.

6. Configure MFA Exclusion for Service Accounts

Ensure integration accounts are not blocked by MFA sign-on policies. [src6]

  1. Navigate to OCI Console > Identity & Security > Domains > Security > Sign-on policies
  2. Edit the sign-on policy rule that enforces MFA
  3. Add exclusion for integration user (by username or group)
  4. Or create a dedicated no-MFA rule for service accounts with higher priority

Verify: Service account authenticates via Client Credentials without MFA challenge.

Code Examples

Python: OAuth 2.0 Client Credentials Token Request

# Input:  Oracle ERP Cloud tenant URL, Client ID, Client Secret
# Output: Access token string for API calls

import requests  # requests>=2.31.0

def get_oracle_erp_token(tenant_url, client_id, client_secret):
    """Obtain OAuth 2.0 access token from Oracle OCI IAM."""
    token_url = f"{tenant_url}/oauth2/v1/token"
    response = requests.post(
        token_url,
        auth=(client_id, client_secret),
        data={
            "grant_type": "client_credentials",
            "scope": "urn:opc:resource:consumer::all"
        },
        headers={"Content-Type": "application/x-www-form-urlencoded"},
        timeout=30
    )
    response.raise_for_status()
    return response.json()["access_token"]

Python: JWT Assertion Token Request

# Input:  Private key (PEM), Client ID, Token endpoint
# Output: Access token obtained via JWT assertion

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

def get_oracle_erp_token_jwt(token_endpoint, client_id, private_key_pem):
    """Obtain token using JWT assertion (no shared secret)."""
    now = int(time.time())
    claims = {
        "iss": client_id, "sub": client_id,
        "aud": token_endpoint,
        "iat": now, "exp": now + 300,
    }
    signed_jwt = jwt.encode(claims, private_key_pem, algorithm="RS256")
    response = requests.post(
        token_endpoint,
        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,
    )
    response.raise_for_status()
    return response.json()["access_token"]

JavaScript/Node.js: Client Credentials with Token Caching

// Input:  Oracle tenant URL, Client ID, Client Secret
// Output: Cached access token with automatic refresh

class OracleERPAuth {
  constructor(tenantUrl, clientId, clientSecret) {
    this.tokenUrl = `${tenantUrl}/oauth2/v1/token`;
    this.clientId = clientId;
    this.clientSecret = clientSecret;
    this.token = null;
    this.expiresAt = 0;
  }
  async getToken() {
    if (this.token && Date.now() < this.expiresAt - 60000) return this.token;
    const credentials = Buffer.from(
      `${this.clientId}:${this.clientSecret}`
    ).toString("base64");
    const response = await fetch(this.tokenUrl, {
      method: "POST",
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
        Authorization: `Basic ${credentials}`,
      },
      body: "grant_type=client_credentials&scope=urn:opc:resource:consumer::all",
    });
    if (!response.ok) throw new Error(`Token failed: ${response.status}`);
    const data = await response.json();
    this.token = data.access_token;
    this.expiresAt = Date.now() + data.expires_in * 1000;
    return this.token;
  }
}

cURL: Quick Authentication Test

# Test Client Credentials flow
curl -v -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"

# Expected: {"access_token":"eyJ0eXAiOi...","token_type":"Bearer","expires_in":3600}

# Test token against Fusion REST API
curl -X GET \
  "https://<erp-host>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest" \
  -H "Authorization: Bearer <ACCESS_TOKEN>"

Data Mapping

Authentication Credential Mapping

Source (Integration Platform)Target (Oracle OCI IAM)TypeTransformGotcha
Client IDConfidential App Client IDStringDirectMust be from the correct identity domain
Client SecretConfidential App Client SecretStringDirectRotate periodically; store in vault
Private Key (PEM)Certificate uploaded to appRSA KeyConvert from PKCS12 if neededMust match public cert on app
Scopeurn:opc:resource:consumer::allStringDirectOr use specific resource scopes
Grant typeclient_credentials or JWT bearer URNStringDirectMust match enabled grant types

Data Type Gotchas

Error Handling & Failure Points

Common Error Codes

CodeMeaningCauseResolution
401 UnauthorizedInvalid or expired tokenToken expired, wrong credentials, or LBAC blockingCheck token expiry; verify LBAC allowlist; re-authenticate
403 ForbiddenInsufficient permissionsService user lacks required Fusion Cloud roleAssign correct application roles to integration user
400 Bad RequestInvalid token requestWrong grant_type, missing scope, inactive appVerify grant type enabled; check scope URN; ensure app Active
429 Too Many RequestsRate throttledExcessive API callsExponential backoff: wait 2^n seconds, max 5 retries
500 Internal Server ErrorOracle server errorTransient infrastructure issueRetry with backoff; check Oracle Cloud status page
INVALID_CLIENTClient auth failedWrong Client ID or SecretVerify credentials; check identity domain
[src1, src3]

Failure Points in Production

Anti-Patterns

Wrong: Hardcoding Basic Auth credentials in integration code

# BAD -- credentials in every request, exposed in logs
response = requests.get(
    "https://erp.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest/invoices",
    auth=("admin_user", "P@ssw0rd123"),  # Credentials in source code!
)

Correct: Use OAuth 2.0 with credentials from a vault

# GOOD -- token-based auth, credentials from environment/vault
import os
token = get_oracle_erp_token(
    os.environ["ORACLE_TENANT_URL"],
    os.environ["ORACLE_CLIENT_ID"],
    os.environ["ORACLE_CLIENT_SECRET"],
)
response = requests.get(url, headers={"Authorization": f"Bearer {token}"})

Wrong: Requesting a new token for every API call

# BAD -- unnecessary token requests, wastes latency
for invoice_id in invoice_ids:
    token = get_oracle_erp_token(tenant, client_id, secret)  # New token each time!
    response = requests.get(f"{url}/invoices/{invoice_id}",
        headers={"Authorization": f"Bearer {token}"})

Correct: Cache token and reuse until near expiry

# GOOD -- single token reused, refreshed proactively
auth = OracleTokenCache(tenant, client_id, secret)
for invoice_id in invoice_ids:
    token = auth.get_valid_token()  # Cached, auto-refreshes if near expiry
    response = requests.get(f"{url}/invoices/{invoice_id}",
        headers={"Authorization": f"Bearer {token}"})

Wrong: Applying MFA to all users without service account exclusion

-- BAD sign-on policy:
Rule 1: "All Users" --> Require MFA (no exceptions)
-- Service accounts cannot authenticate via OAuth Resource Owner grant

Correct: Separate sign-on policy rule for service accounts

-- GOOD sign-on policy:
Rule 1 (higher priority): "Integration Service Accounts" group --> Allow, no MFA
Rule 2 (lower priority): "All Users" --> Require MFA
-- Service accounts work; human users still require MFA

Common Pitfalls

Diagnostic Commands

# Test token endpoint connectivity
curl -v -X POST \
  "https://<tenant>.identity.oraclecloud.com/oauth2/v1/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials" \
  -u "<CLIENT_ID>:<CLIENT_SECRET>"

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

# Test Fusion Cloud API access with token
curl -w "\nHTTP Status: %{http_code}\n" \
  -X GET "https://<erp-host>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest" \
  -H "Authorization: Bearer <ACCESS_TOKEN>"

# Verify identity domain OpenID configuration
curl "https://<tenant>.identity.oraclecloud.com/.well-known/openid-configuration" \
  | python3 -m json.tool

# Check if LBAC is causing auth failures (test from known-good IP)
curl -X GET "https://<erp-host>.fa.ocs.oraclecloud.com/fscmRestApi/resources/latest" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -w "\nHTTP: %{http_code}, Remote IP: %{remote_ip}\n"

Version History & Compatibility

ReleaseDateStatusBreaking ChangesMigration Notes
OCI IAM Identity Domains (GA)2022-02CurrentIDCS admin console moved to OCI ConsoleAll IDCS APIs and endpoints continue to work
IDCS Region Migration2023-03 to 2024-06CompleteAutomatic region-by-region migrationNo integration changes required
Identity Domain Replication2024-08CurrentNoneNew feature: cross-region DR
Fusion Cloud Release 25A2025-01CurrentNone auth-relatedQuarterly release; API endpoints unchanged

Deprecation Policy: Oracle has not announced a formal deprecation date for Basic Authentication on Fusion Cloud APIs, but all documentation strongly recommends OAuth 2.0. Plan for eventual deprecation. [src1, src2]

When to Use / When Not to Use

Use WhenDon't Use WhenUse Instead
Building server-to-server integrations with Oracle ERP CloudNeed Oracle NetSuite authentication (uses TBA)business/erp-integration/netsuite-api-capabilities/2026
Connecting middleware (OIC, MuleSoft, Boomi) to Fusion CloudNeed general OAuth 2.0 patterns (not Oracle-specific)software/patterns/oauth2-client-credentials/2026
Setting up SSO/federation for Oracle ERP Cloud usersNeed SAP S/4HANA authenticationbusiness/erp-integration/sap-s4hana-api-capabilities/2026
Migrating from Basic Auth to OAuth 2.0 on Oracle ERP CloudNeed Oracle E-Business Suite on-premise authN/A -- different product line

Important Caveats

Related Units