docs/src/main/sphinx/security/oauth2.md
Trino can be configured to enable OAuth 2.0 authentication over HTTPS for the Web UI and the JDBC driver. Trino uses the Authorization Code flow which exchanges an Authorization Code for a token. At a high level, the flow includes the following steps:
To enable OAuth 2.0 authentication for Trino, configuration changes are made on the Trino coordinator. No changes are required to the worker configuration; only the communication from the clients to the coordinator is authenticated.
Set the callback/redirect URL to https://<trino-coordinator-domain-name>/oauth2/callback,
when configuring an OAuth 2.0 authorization server like an OpenID Connect (OIDC)
provider.
If Web UI is enabled, set the post-logout callback URL to
https://<trino-coordinator-domain-name>/ui/logout/logout.html when configuring
an OAuth 2.0 authentication server like an OpenID Connect (OIDC) provider.
Using {doc}TLS <tls> and {doc}a configured shared secret </security/internal-communication> is required for OAuth 2.0 authentication.
Trino supports reading Authorization Server configuration from OIDC provider configuration metadata document. During startup of the coordinator Trino retrieves the document and uses provided values to set corresponding OAuth2 authentication configuration properties:
authorization_endpoint -> http-server.authentication.oauth2.auth-urltoken_endpoint -> http-server.authentication.oauth2.token-urljwks_uri -> http-server.authentication.oauth2.jwks-urluserinfo_endpoint -> http-server.authentication.oauth2.userinfo-urlaccess_token_issuer -> http-server.authentication.oauth2.access-token-issuerend_session_endpoint -> http-server.authentication.oauth2.end-session-url:::{warning}
If the authorization server is issuing JSON Web Tokens (JWTs) and the
metadata document contains userinfo_endpoint, Trino uses this endpoint to
check the validity of OAuth2 access tokens. Since JWTs can be inspected
locally, using them against userinfo_endpoint may result in authentication
failure. In this case, set the
http-server.authentication.oauth2.oidc.use-userinfo-endpoint configuration
property to false
(http-server.authentication.oauth2.oidc.use-userinfo-endpoint=false). This
instructs Trino to ignore userinfo_endpoint and inspect tokens locally.
:::
This functionality is enabled by default but can be turned off with:
http-server.authentication.oauth2.oidc.discovery=false.
(trino-server-configuration-oauth2)=
Using the OAuth2 authentication requires the Trino coordinator to be secured with TLS.
The following is an example of the required properties that need to be added
to the coordinator's config.properties file:
http-server.authentication.type=oauth2
http-server.https.port=8443
http-server.https.enabled=true
http-server.authentication.oauth2.issuer=https://authorization-server.com
http-server.authentication.oauth2.client-id=CLIENT_ID
http-server.authentication.oauth2.client-secret=CLIENT_SECRET
To enable OAuth 2.0 authentication for the Web UI, the following property must be added:
web-ui.authentication.type=oauth2
The following configuration properties are available:
:::{list-table} OAuth2 configuration properties :widths: 40 60 :header-rows: 1
http-server.authentication.typeoauth2 to enable OAuth2
authentication for the Trino coordinator.http-server.authentication.oauth2.issueriss
field.http-server.authentication.oauth2.access-token-issueriss field. Providing this value while OIDC
discovery is enabled overrides the value from the OpenID provider metadata
document. Defaults to the value of
http-server.authentication.oauth2.issuer.http-server.authentication.oauth2.auth-urlhttp-server.authentication.oauth2.token-urlhttp-server.authentication.oauth2.jwks-urlhttp-server.authentication.oauth2.userinfo-url/userinfo endpoint. If supplied then this URL is used
to validate the OAuth access token and retrieve any associated claims. This
is required if the IdP issues opaque tokens. Providing this value while OIDC
discovery is enabled overrides the value from the OpenID provider metadata
document.http-server.authentication.oauth2.client-idhttp-server.authentication.oauth2.client-secrethttp-server.authentication.oauth2.additional-audienceshttp-server.authentication.oauth2.scopeshttp-server.authentication.oauth2.challenge-timeout15m.http-server.authentication.oauth2.state-keyhttp-server.authentication.oauth2.user-mapping.pattern(.*) which allows any username.http-server.authentication.oauth2.principal-fieldsub. Other commonly used fields include sAMAccountName, name,
upn, and email.http-server.authentication.oauth2.oidc.discoverytrue.http-server.authentication.oauth2.oidc.discovery.timeout30s.http-server.authentication.oauth2.oidc.use-userinfo-endpointuserinfo_endpoint in the provider
metadata.
When a userinfo_endpoint value is supplied this URL is used to validate
the OAuth 2.0 access token, and retrieve any associated claims. This flag
allows ignoring the value provided in the metadata document. Default is
true.http-server.authentication.oauth2.end-session-url(trino-oauth2-refresh-tokens)=
Refresh tokens allow you to securely control the length of user sessions within applications. The refresh token has a longer lifespan (TTL) and is used to refresh the access token that has a shorter lifespan. When refresh tokens are used in conjunction with access tokens, users can remain logged in for an extended duration without interruption by another login request.
In a refresh token flow, there are three tokens with different expiration times:
http-server.authentication.oauth2.refresh-tokens.issued-token.timeout
property.In the following scenario, the lifespan of the tokens issued by an IdP are:
Because the access token lifespan is only five minutes, Trino uses the longer
lifespan refresh token to request another access token every five minutes on
behalf of a user. In this case, the maximum
http-server.authentication.oauth2.refresh-tokens.issued-token.timeout is
twenty-four hours.
To use refresh token flows, the following property must be enabled in the coordinator configuration.
http-server.authentication.oauth2.refresh-tokens=true
Additional scopes for offline access might be required, depending on IdP configuration.
http-server.authentication.oauth2.scopes=openid,offline_access [or offline]
The following configuration properties are available:
:::{list-table} OAuth2 configuration properties for refresh flow :widths: 40 60 :header-rows: 1
http-server.authentication.oauth2.refresh-tokens.issued-token.timeout1h. The timeout value is the
maximum session time for an OAuth2-authenticated client with refresh tokens
enabled. For more details, see .http-server.authentication.oauth2.refresh-tokens.issued-token.issuerTrino_coordinator. The current Trino version is
appended to the value. This is mainly used for debugging purposes.http-server.authentication.oauth2.refresh-tokens.issued-token.audienceTrino_coordinator.http-server.authentication.oauth2.refresh-tokens.secret-key(trino-oauth2-troubleshooting)=
To debug issues, change the [log level <log-levels>` for the OAuth 2.0 authenticator:
io.trino.server.security.oauth2=DEBUG
To debug issues with OAuth 2.0 authentication use with the web UI, set the following configuration property:
io.trino.server.ui.OAuth2WebUiAuthenticationFilter=DEBUG
This assumes the OAuth 2.0 authentication for the Web UI is enabled as described
in {ref}trino-server-configuration-oauth2.
The logged debug error for a lapsed refresh token is Tokens refresh challenge has failed.
:::{warning}
If a refresh token lapses, the user session is interrupted and the user must
reauthenticate by logging in again. Ensure you set the
http-server.authentication.oauth2.refresh-tokens.issued-token.timeout
value to less than or equal to the duration of the refresh token expiration
issued by your IdP. Optimally, the timeout should be slightly less than the
refresh token lifespan of your IdP to ensure that sessions end gracefully.
:::