OpenID Connect (OIDC)
OpenID authentication is only available through a Custom plan!
This page describes how to configure a service with OpenID Connect as Access Control Policy.
Introduction to OpenID¶
OpenID Connect (OIDC) is an identity protocol that utilizes the authorization and authentication mechanisms of OAuth 2.0.
It delegates the authentication to an external provider (for example, Google Accounts, Microsoft, etc.) and obtaining the end user's session claims and scopes for authorization purposes.
To authenticate the user, the agent redirects through the authentication provider.
Once the authentication is complete, users are redirected back to the agent before being authorized to access the upstream application.
Credentials¶
To use the OIDC Access Control Policy (ACP),
configure your identity provider by defining at least a callback URL.
Then get the Client ID
and Client Secret
from your provider.
Google Provider Example
To configure a Google Provider, you may use the preconfigured OIDC Google ACP, or take inspiration from its configuration on this one.
Claims¶
The ID Token Claims Set represents a JSON object whose members are the claims conveyed by the Token.
Those claims
can be used to authorize requests based on the following functions:
Function | Description | Example |
---|---|---|
Equals | The value in key must be equal to value . |
Equals(`grp`, `admin`) |
Prefix | The value in key must start with the prefix of value . |
Prefix(`referrer`, `http://example.com`) |
Contains (string) | The value in key must contain value . |
Contains(`referrer`, `/foo/`) |
Contains (array) | The array in key must contain the value . |
Contains(`areas`, `home`) |
SplitContains | The value in key must contain the value once split by the separator. |
SplitContains(`scope`, ` `, `writer`) |
OneOf | The array in key must contain one of the values . |
OneOf(`areas`, `office`, `lab`) |
All functions can be joined by boolean operands. The supported operands are:
Operand | Description | Example |
---|---|---|
&& |
Compares two functions and returns true only if both evaluate to true. | Equals(`grp`, `admin`) && Equals(`active`, `true`) |
\\ |
Compares two functions and returns true if either evaluate to true. | Equals(`grp`, `admin`) \ |
! |
Returns false if the function is true, otherwise returns true. | !Equals(`grp`, `testers`) |
All examples return true for the following data structure:
{
"active": true,
"grp": "admin",
"scope": "reader writer deploy",
"referrer": "http://example.com/foo/bar",
"areas": [
"office",
"home"
]
}
Nested claims¶
Nested claims are supported by using a dot (.) between keys. For example:
user.name
{
"active": true,
"grp": "admin",
"scope": "reader writer deploy",
"referrer": "http://example.com/foo/bar",
"areas": [
"office",
"home"
],
"user" {
"name": "John Snow",
"status": "undead"
}
}
John Snow
Handling keys that contain a dot (.)
If the key
contains a dot, the dot can be escaped using a backslash (\)
.
Handling a key that contains a backslash ()
If the key
contains a \
, it needs to be doubled \\
.
Web Interface¶
You can manage your Access Control Policies from the Traefik Hub UI.
Traefik Hub Agent
Creating any ACP requires you to have a connected Traefik Hub Agent. Please, refer to the installation guide for more information.
To create an OIDC
Access Control Policy,
select the Create a Policy
or go to the creation page directly.
The form contains general and method-specific fields.
Required fields¶
These are the required fields to fill to be able to create an Access Control Policy.
Field | Example | Description |
---|---|---|
Agent | "my-agent" | Refers to the agent on which the ACP will be created. |
Method | OIDC | Authentication protocol to use in this ACP. |
Provider | OIDC | OIDC provider to use in this ACP. |
Provider Issuer | "https://accounts.google.com" | The URL to the OpenID Connect provider (e.g.: https://accounts.google.com ). It should point to the server which provides the OpenID Connect configuration. |
Identification Client Id | "xxxx.apps.googleusercontent.com" | The unique client identifier for an account on the OpenID Connect provider (cf Credentials). |
Identification Client Secret | "GOCSPX-XXXXX" | The OAuth Client Secret. Only available with a non-Kubernetes cluster. |
Identification Client Secret Name | "my-oidc-secret" | The Name of the Kubernetes Secret used to store the OAuth Client Secret. Only available with a Kubernetes cluster. |
Identification Client Secret Namespace | "my-ns" | The Namespace of the Kubernetes Secret used to store the OAuth Client Secret. Only available with a Kubernetes cluster |
Identification Redirect URL | "https:/example.org/callback" | The redirect URL is the URL used by the OpenID Connect provider to redirect back to the agent once the authentication is complete. |
Claims Scopes | "openid","myscope" | The scopes to request. Must include openid . |
Claims | "Equals(grp , admin )" |
Claims constraints used to authorize the request (cf: claims). |
OIDC Secret¶
The Client Secret must be set for Kubernetes clusters
apiVersion: v1
kind: Secret
metadata:
name: oidc-secret
namespace: my-ns
stringData:
clientSecret: XXXX
Additional Parameters¶
These parameters allow you to configure the OIDC authentication deeper. They are not mandatory.
Field | Example | Description |
---|---|---|
Forward Headers | "X-App-Group": "group" | Sets the HTTP headers to add to requests and populates them with values extracted from the ID Token claims returned by the authentication server. |
Auth Parameters | "hd":"example.org" | Sets additional request parameters send to the identity provider. |
Note
Claims to be forwarded that are not found in the ID Token claims result in empty headers.
When all the fields are set up, select the Save button to register the Access Control Policy on your cluster.
The newly created ACP should be visible and manageable from the Access Control Policies listing page.
Custom Resource Definition¶
Custom Resource Definition is only available on Kubernetes.
Access Control Policies can be configured from Kubernetes manifest files containing a Traefik Hub custom resource. Custom Resource Definition contains resources that the Traefik Hub Agent can understand to manage ACPs.
The resource is called AccessControlPolicy
from the hub.traefik.io
group.
Here is a minimal and a common working configuration to create a basic Access Control Policy.
apiVersion: hub.traefik.io/v1alpha1
kind: AccessControlPolicy
metadata:
name: oidc-acp
spec:
oidc:
issuer: https://xxxx
clientId: XXX
secret:
name: oidc-secret
namespace: my-ns
apiVersion: hub.traefik.io/v1alpha1
kind: AccessControlPolicy
metadata:
name: oidc-acp
spec:
oidc:
issuer: https://accounts.google.com
redirectUrl: /callback
scopes:
- openid
session:
expiry: 86400
path: /
clientId: "xxxx.apps.googleusercontent.com"
secret:
name: oidc-secret
namespace: my-ns
stateCookie:
path: /
The following secret contains the OAuth Client Secret used by the ACP.
# oidc-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: oidc-secret
namespace: my-ns
stringData:
clientSecret: XXXX
To create the ACP, apply the manifest on the cluster using the Kubernetes CLI tool:
kubectl apply -f oidc-acp.yml
You are now able to see the ACP in the Traefik Hub UI, and in your Kubernetes cluster:
kubectl get accesscontrolpolicy oidc-acp
References¶
Name¶
Required
metadata.name
This is the name of the resource. The name is used to reference this resource in other Kubernetes resources and is also visible in the Traefik Hub UI.
The name should have less than 63 characters. It should contain only letters, numbers, and hyphens.
Example
metadata:
name: oidc-acp
Issuer¶
Required
spec.oidc.issuer
The issuer
is the URL to the OpenID Connect provider (e.g.: https://accounts.google.com
).
It should point to the server which provides the OpenID Connect configuration.
Example
spec:
oidc:
issuer: https://accounts.google.com
Client ID¶
Required
spec.oidc.clientId
The unique client identifier for an account on the OpenID Connect provider (cf Credentials).
Example
spec:
oidc:
clientId: XXX
Secret¶
Required
spec.oidc.secret
The name
and namespace
of the Kubernetes Secret
used to store the OAuth Client Secret.
The Secret
must contain the OpenID Client Secret (cf Credentials).
Example
spec:
oidc:
secret:
name: oidc-secret
namespace: my-ns
apiVersion: v1
kind: Secret
metadata:
name: oidc-secret
namespace: my-ns
stringData:
clientSecret: XXXX
RedirectURL¶
spec.oidc.redirectURL
The redirect URL is the URL used by the OpenID Connect provider to redirect back to the agent once the authentication is complete.
Example
spec:
oidc:
redirectURL: https://example.org/callback
Scope¶
spec.oidc.scopes
The scopes to request. Must include openid
.
Example
spec:
oidc:
scopes:
- openid
- myscope
Claims¶
spec.oidc.claims
Claims constraints used to authorize the request (cf: claims).
Example
spec:
oidc:
claims: Equals(`grp`, `admin`)
Forward Headers¶
spec.oidc.forwardHeaders
Sets the HTTP headers to add to requests and populates them with values extracted from the ID Token claims returned by the authentication server.
Note
Claims to be forwarded that are not found in the ID Token claims result in empty headers.
Example
spec:
oidc:
forwardHeaders:
X-App-Group: group
AuthParams¶
spec.oidc.authParams
Sets additional request parameters send to the identity provider.
Example
spec:
oidc:
authParams:
hd: example.org
LogoutURL¶
spec.oidc.logoutUrl
The URL on which the session should be deleted to log users out. It can be a path (/logout, for example), a host, and a path (example.com/logout) or a complete URL (https://example.com/logout).
Example
spec:
oidc:
logoutUrl: https://example.org/logout
Session¶
Domain¶
spec.oidc.session.domain
Specifies the hosts that are allowed to receive the cookie. If specified, then subdomains are always included.
For example, if it is set to example.com
, then cookies are included on subdomains like api.example.com
.
Example
spec:
oidc:
session:
domain: example.org
Path¶
spec.oidc.session.path
Indicates a URL path that must exist in the requested URL to send the Cookie header.
The %x2F
("/") character is considered a directory separator, and subdirectories will match as well.
For example, if session.path
is set to /docs
, these paths will match:
/docs
/docs/web/
/docs/web/http
Example
spec:
oidc:
session:
path: /
Refresh¶
spec.oidc.session.refresh
When enabled, refresh the ID token when it expires.
Example
spec:
oidc:
session:
refresh: true
SameSite¶
spec.oidc.session.sameSite
Informs browsers how they should handle the session cookie on cross-site requests.
Setting it to lax
or strict
can provide some protection against cross-site request forgery attacks (CSRF).
Accepted values are the following:
none
: The browser will send cookies with both cross-site requests and same-site requests.strict
: The browser will only send cookies for same-site requests (requests originating from the site that set the cookie). If the request originated from a different URL than the URL of the current location, none of the cookies tagged with thestrict
attribute will be included.lax
: Same-site cookies are withheld on cross-site sub-requests, such as calls to load images or frames, but will be sent when a user navigates to the URL from an external site; for example, by following a link.
Example
spec:
oidc:
session:
sameSite: lax
Secure¶
spec.oidc.session.secure
A secure cookie is only sent to the server when a request is made with the https
scheme.
Example
spec:
oidc:
session:
secure: true
StateCookie¶
Domain¶
spec.oidc.stateCookie.domain
Specifies the hosts that are allowed to receive the cookie. If specified, then subdomains are always included.
For example, if it is set to example.com
, then cookies are included on subdomains like api.example.com
.
Example
spec:
oidc:
stateCookie:
domain: example.org
Path¶
spec.oidc.stateCookie.path
Indicates a URL path that must exist in the requested URL to send the Cookie header.
The %x2F
("/") character is considered a directory separator, and subdirectories will match as well.
For example, if stateCookie.path
is set to /docs
, these paths will match:
/docs
/docs/web/
/docs/web/http
Example
spec:
oidc:
stateCookie:
path: /
SameSite¶
spec.oidc.stateCookie.sameSite
Informs browsers how they should handle the state cookie on cross-site requests.
Setting it to lax
or strict
can provide some protection against cross-site request forgery attacks (CSRF).
Accepted values are the following:
none
: The browser will send cookies with both cross-site requests and same-site requests.strict
: The browser will only send cookies for same-site requests (requests originating from the site that set the cookie). If the request originated from a different URL than the URL of the current location, none of the cookies tagged with thestrict
attribute will be included.lax
: Same-site cookies are withheld on cross-site subrequests, such as calls to load images or frames, but will be sent when a user navigates to the URL from an external site; for example, by following a link.
Example
spec:
oidc:
stateCookie:
sameSite: lax
Secure¶
spec.oidc.stateCookie.secure
A secure cookie is only sent to the server when a request is made with the https
scheme.
Example
spec:
oidc:
stateCookie:
secure: true