Skip to main content

OAuth2 Token Endpoint

Overview

The OAuth2 token endpoint is used to generate access tokens required for accessing protected resources. The available grant types include:

  • authorization_code
  • refresh_token
  • client_credentials
  • urn:ietf:params:oauth:grant-type:jwt-bearer

Base URLs:

  • DEV: https://api.dev.koffi.vn/api
  • UAT: https://api.uat.koffi.vn/api
  • Production: https://uat.koffi.vn/api

Endpoint:

  • URL: /v2/oauth/token
  • Method: POST
  • Content-Type: application/x-www-form-urlencoded
  • Headers:
    • Authorization:
      • Depends on grant type authorization will be needed
      • JWT bearer token required for urn:ietf:params:oauth:grant-type:jwt-bearer grant.
      • Basic authentication required for client_credentials grant.

Parameters:

  • grant_type (required): Defines the OAuth2 grant type to be used. Allowed values are:

    • authorization_code
    • refresh_token
    • client_credentials
    • urn:ietf:params:oauth:grant-type:jwt-bearer
  • assertion (required for JWT Bearer Grant): The assertion string when using the JWT bearer grant type.

  • scope (optional): The scopes requested for the token, space-separated. Read scopes for more detail

    • Example: ob.invoices.readonly ob.products.readonly
  • tenant_connection_code (optional for all, required for client_credentials grant): The tenant code for which the token is requested. Defaults to the client application’s tenant if not provided. Read


Grant Types and Usage

1. Client Credentials Grant

  • Used by clients to request a token using their client credentials.
  • Read Application for more detail how to get client_id, client_secret, tenant_connection_code.
  • Each tenant in Koffi has a unique connection code. The client application must provide the corresponding connection code when interacting with a specific tenant.
  • Refresh token is not returned in this grant type

Authorization Header:

The Authorization header for this grant type should contain a basic authentication token, which is a base64 encoded string of client_id:client_secret.

Request Example:

curl --location --request POST 'https://api.dev.koffi.vn/api/v2/oauth/token' --header 'Authorization: Basic <base64(client_id:client_secret)>' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'grant_type=client_credentials' --data-urlencode 'scope=ob.invoices.readonly ob.products.readonly' --data-urlencode 'tenant_connection_code=<your_tenant_code>'

Response:

{
"access_token": "eyJhbGciOi...",
"token_type": "Bearer",
"expires_in": 3600,
"scopes": [
"ob.invoices.readonly",
"ob.products.readonly"
]
}

2. Authorization Code Grant

TBD

3. Refresh Token Grant

TBD

4. JWT Bearer Grant

TDB

Common Authentication Error

Error response

In case of an error, the response will have an HTTP status code other than 200, with the following format

{
"code": "error_code",
"message": "error_message"
}

Error code

  • EOAU001: Invalid grant type
  • EOAU002: JWT Bearer Grant requires assertion
  • EOAU003: JWT Bearer Grant assertion invalid or expired
  • EOAU004: JWT Bearer Grant assertion client id (iss) is required (iss)
  • EOAU005: JWT Bearer Grant assertion key id (kid) is required
  • EOAU006: JWT Bearer Grant assertion key id (kid) is invalid
  • EOAU007: JWT Bearer Grant assertion audience (aud) is required
  • EOAU008: JWT Bearer Grant assertion user not found (sub)
  • EOAU009: Authorization header not found or invalid
  • EOAU010: Invalid tenant
  • EOAU011: Invalid tenant connection code or client application has no access to target tenant
  • EOAU012: Invalid scope <invalid-scopes>