Skip to main content

OAuth API Authentication

OAuth API Authentication enables secure, programmatic access to the Breeze API using industry-standard OAuth 2.0 tokens. This authentication method is designed for machine-to-machine integrations, automated systems, and service-to-service communication where applications need to access the API without user interaction.

When to Use This​

Use OAuth API Authentication when you need to:

  • Integrate external systems with Breeze programmatically
  • Build automated workflows that access the API
  • Create service-to-service integrations
  • Access the API from scripts, scheduled jobs, or background services
  • Replace API key authentication with a more secure, standards-based approach

This authentication method is ideal for:

  • Payment processor integrations
  • Automated reporting systems
  • CI/CD pipeline integrations
  • Partner API access
  • Mobile or desktop application backends

Before You Start​

To use OAuth API Authentication, you need:

  • OAuth Client Credentials: A client_id and client_secret obtained from an administrator (see OAuth Client Management)
  • API Access: The OAuth client must be associated with a user account that has appropriate roles for your required operations
  • HTTPS Connection: Always use HTTPS in production environments
Required for Setup

Creating OAuth Clients: Only users with Super administrator role can create OAuth clients. See OAuth Client Management for more information.

How OAuth Authentication Works​

OAuth API Authentication uses the OAuth 2.0 Client Credentials flow, which is designed for machine-to-machine communication. Here's how it works:

Overview​

  1. Obtain Credentials: Get client_id and client_secret (see OAuth Client Management)
  2. Request Access Token: Exchange credentials for a short-lived access token
  3. Use Access Token: Include the token in API requests to authenticate
  4. Refresh Token: Request a new token before expiration (tokens cannot be refreshed)

Step 1: Obtain OAuth Client Credentials​

  1. Create an OAuth client associated with a user account
  2. Provide you with:
    • Client ID: A unique identifier (format: oauth_xxx)
    • Client Secret: A secure secret string (shown only once during creation)

Important: Store these credentials securely. Never commit them to version control or share them insecurely.

Step 2: Request an Access Token​

To authenticate, send a POST request to the token endpoint:

Endpoint: POST /oauth/token

Request Format:

{
"grant_type": "client_credentials",
"client_id": "oauth_abc123...",
"client_secret": "your_secret_here",
"scope": "read:credentials write:credentials"
}

Parameters:

  • grant_type: Must be "client_credentials" (required)
  • client_id: Your OAuth client ID (required)
  • client_secret: Your OAuth client secret (required)
  • scope: Optional space-separated list of scopes (permissions are determined by the user's roles, not scopes)

Response:

{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": ""
}

Response Fields:

  • access_token: JWT token to use for API authentication (valid for 1 hour by default)
  • token_type: Always "Bearer"
  • expires_in: Token lifetime in seconds (default: 3600 = 1 hour)
  • scope: Space-separated list of granted scopes

Step 3: Use the Access Token​

Include the access token in all API requests using the Authorization header:

Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...

Example API Request:

curl https://api.domain.com/graphql \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Content-Type: application/json" \
-d '{"query": "{ CredentialV1(credentialId: \"...\") { _id name } }"}'

Step 4: Handle Token Expiration​

Access tokens expire after 1 hour (default). Before expiration:

  1. Request a New Token: Use the same /oauth/token endpoint with your client credentials
  2. Update Your Application: Replace the old token with the new one
  3. Implement Token Caching: Cache tokens and refresh them proactively (e.g., 5 minutes before expiration)

Best Practice: Request a new token before the current one expires to avoid service interruption.

Permissions and Authorization​

How Permissions Work​

OAuth client permissions are determined by the user account associated with the client, not by OAuth scopes. When the an OAuth client is created, it is associated with a specific user account. The client inherits all permissions from that user's roles.

Important: The OAuth client can only access resources within the tenant of the associated user account.

OAuth Scopes​

OAuth scopes are currently not used for permissions. They are reserved for future use.

Token Management Best Practices​

Token Caching​

  • Cache tokens to reduce token requests and improve performance
  • Track expiration and refresh tokens proactively (5 minutes before expiration)
  • Store tokens securely in memory or secure storage (never in logs or error messages)

Error Handling​

  • Handle token expiration: Implement automatic token refresh when you receive 401 Unauthorized responses
  • Handle rate limits: If you receive 429 Too Many Requests, implement exponential backoff
  • Log errors appropriately: Never log tokens or client secrets

Security​

  • Store secrets securely: Use environment variables or secret management systems
  • Rotate secrets: Rotate client secrets regularly (every 90 days recommended)
  • Monitor usage: Track token usage and authentication failures

Rate Limiting​

The OAuth token endpoint has rate limiting to prevent abuse:

  • Default limit: 100 requests per hour per client
  • Window: 1 hour (3600 seconds)
  • Tracking: Per client_id

Best Practices:

  • Implement token caching to minimize token requests
  • Reuse tokens until expiration
  • If you hit rate limits, reduce request frequency or contact support for custom limits

Common Issues and Solutions​

"Invalid client credentials"​

Possible causes:

  • Incorrect client_id or client_secret
  • Client has been revoked or is inactive
  • Client secret has been rotated (use the latest secret)

Solutions:

  • Verify credentials are correct (no extra spaces or encoding issues)
  • Check with your administrator that the client is active
  • Request new credentials if the secret was rotated

"Token validation failed"​

Possible causes:

  • Token has expired
  • Incorrect Authorization header format
  • Token signature is invalid

Solutions:

  • Request a new token (tokens expire after 1 hour)
  • Ensure header format is: Authorization: Bearer <token>
  • Verify you're using the latest token

"Rate limit exceeded"​

Possible causes:

  • Too many token requests in a short time
  • Not caching tokens between requests

Solutions:

  • Implement token caching
  • Reduce token request frequency
  • Wait for the rate limit window to reset (1 hour)

"Insufficient permissions"​

Possible causes:

  • Associated user account lacks required roles
  • User account has been deactivated
  • Accessing resources outside the user's tenant

Solutions:

  • Verify the associated user account has the required roles
  • Check with your administrator to update user roles if needed
  • Ensure you're accessing resources within the correct tenant

What's Next?​