Skip to content

Security (Auth) Overview

swenhelge edited this page Nov 16, 2021 · 2 revisions

The API server provides both HTTP Basic Authentication and Bearer Token/JWT mechanisms. Either of the mechanisms are sufficient for authentication. Basic Authentication is deprecated and only provided for backwards compatibility.

Basic Authentication relies on a simple file based user registry. The JWT token is locally validated and multiple Identity Providers were tested as a token issuer.

Users are granted access to organizations (tenants) and privileges within the tenant based on the claims that are present in the JWT. Users who were authenticated using basic authentication are granted access to ALL tenants and provided privileges associated with the user roles.

Currently there are two roles:

  • platform-admin: grants access to the platform management APIs.
  • org-admin: grants access to specific organizations and privileges for all organization level resources.

The role model may be refined in subsequent releases.

File Based User Registry

Basic authentication uses a file based user registry. It is intended for demo/test purposes as it stores passwords in clear text. See below for a short example, the repo contains a full example:

{
  "tom": {
    "password": "tomspassword",
    "roles": [
      "org-admin"
    ]
  },
	"dick": {
    "password": "dickspassword",
    "roles": [
      "org-admin"
    ]
  }
}

Users are configured as properties of the root JSON object. Each user is defined by an object with the properties

  • password: string, user password
  • roles: string array, roles associated with the user. Currently supported roles platform-admin and org-admin

The file based user registry is a JSON file listing users, their passwords and roles. The location of the user registry is configurable (see "Environment Configuration")

Identity Provider Integration

JWT tokens are validated locally, the validation and extraction of user roles, groups is configurable (see "Environment Configuration").

JWT should be obtained from a suitable IdP and it is validated by signature verification and expected values in specific attributes. The public key or certificate of the IdP must be provided in PEM format, the attributes iss (issuer) and aud (audience) must match the expected values as configured in the API Server.

The IdP must be configured to include attributes in the JWT that describe a user's name (principal), roles and organization membership. These attribute names differ between IdPs and the extraction paths from the JWT can be configured accordingly. The principal attribute MUST be a string. The roles and organizations attributes can be either a string array or a string listing values separated by space characters. For example both of these are valid values for these attributes:

"roles": ["org-admin","platform-admin"]
"roles": "org-admin platform-admin"

Here is an example payload extracted from a JWT Id token obtained from Okta:

  • principal name (user name) is contained in the preferred_username attribute
  • roles attribute is groups
  • organizations attribute is organization

The user authenticated with this token is api1@gmail.com, belongs to one organization my-org and has the org-admin role.

{
  "sub": "00uncii0ixg9gTgie5d6",
  "name": "API user-1",
  "ver": 1,
  "iss": "https://dev-12123555.okta.com/oauth2/default",
  "aud": "0oancf26sFegoXz8l5d6",
  "iat": 1619616618,
  "exp": 1619620218,
  "jti": "ID.jmgMSJuaYFHqumM1pYQkNdDZxjLYbgt6dGOXgnB3fzs",
  "amr": [
    "pwd"
  ],
  "idp": "00oncdc53KoJbUvfN5d6",
  "preferred_username": "api1@gmail.com",
  "auth_time": 1619616364,
  "at_hash": "oc7VLYmJj8TDuwB0zGrl1w",
  "organization": "my-org",
  "groups": [
    "Everyone",
    "org-admin"
  ]
}

Example IdP Configurations

Tested with:

Obtaining a JWT

The API Explorer (Swagger UI) can be used to obtain a token. The API definition is configured with a Open Id Connect Discovery URL that the API Explorer uses to find out the authorization and token endpoints for the IdP that the API Server is configured to use.

Alternatively you can provide a JWT Id token - that you have obtained previously e.g. via postman - as Bearer token in the API Explorer.