Authenticate Using JSON Web Tokens¶
Okera can use JSON Web Tokens (JWTs) for authentication.
These tokens can either be generated externally and provided to Okera, or else Okera can be configured to work with an external service (via REST) to acquire and validate JWTs.
If only JWTs are used for authentication, Okera also requires that a system token be generated for use in authentication with internal services.
This is typically a token with okera
as the subject.
Okera supports the standard JWT claims including:
sub
exp
nbf
Okera requires that JWTs have a sub
claim.
For specifying groups in which the token subject is a member, Okera suggests using the claim groups
and storing the associated value as a list of strings.
Example JWT payload:
{
"sub": "John Doe",
"iss": "okera.com",
"groups": [
"web_user",
"philatelist",
"cat_person"
],
"exp": 1590510807
}
Okera can be configured for JWT support using two approaches:
- Provide services with the public key used to verify the tokens and the algorithm used (RSA256 or RSA512).
- Configure an endpoint for validating tokens.
For either of these approaches, you must also provide:
- A system token that Okera uses internally for interservice communication.
- A separate private key and public key pair (along with the algorithm for the public key) for Okera to use to create its own tokens when needed.
Using Both Approaches for JWT Validation¶
To support both approaches, configure the settings for both, and each is instantiated. The external endpoint is used first. If the JWT is not validated by that service, it is passed to the public-key authenticator for validation.
Configuration Settings¶
For information on the Okera configuration settings used to configure SSL in the values.yaml
file used by the Helm chart for your Okera cluster, see JWT Configuration Parameters.
Remote Endpoint Validation¶
To configure the remote endpoint approach for validation, configure an endpoint for validating tokens remotely by way of the JWT_AUTHENTICATION_SERVER_URL
setting.
For example:
JWT_AUTHENTICATION_SERVER_URL: http://10.1.10.1:8000/idp/userinfo.openid
The call from Okera to the REST endpoint is a POST request that passes the JWT to validate as a bearer token and expects JSON as the return value. As a REST call, it looks like this:
curl -X POST -H 'Accept: application/json' -H 'Authorization: Bearer <token>' http://<ip>:<port>/<endpoint>
The return value must contain the key "sub" and the value must be a string that contains the username that corresponds to the passed token. Example:
{
"sub": "santa@okera.com"
}
System Token¶
To configure Okera to do interservice communication when JWT authentication is enabled, the setting SYSTEM_TOKEN
must be set to the full path of the token to use.
For example:
SYSTEM_TOKEN: file:///path/to/system.token
This token should have a sub
value of okera
.
Group Resolution Using JWTs¶
When a request is authenticated with JWTs, the following sequence is used to determine what groups this request will use for the authenticated user:
- If the JWT contains a
groups
field, then the value of this field is used as the set of groups. - If an AD/LDAP group resolver is defined, then the
sub
field of the JWT is used as the user passed to the resolver. - If an endpoint-based group resolver is defined, then the
sub
field of the JWT is used as the user passed to the resolver.