This is an automated email from the ASF dual-hosted git repository.

gtully pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/artemis.git

commit 3142a069be07d26918bb820fc3cb14f4c513bc84
Author: Grzegorz Grzybek <[email protected]>
AuthorDate: Wed Apr 1 12:39:51 2026 +0200

    ARTEMIS-5200 Add documentation section for OIDCLoginModule
---
 docs/user-manual/security.adoc | 110 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 110 insertions(+)

diff --git a/docs/user-manual/security.adoc b/docs/user-manual/security.adoc
index 47cb672639..2fa2d8e460 100644
--- a/docs/user-manual/security.adoc
+++ b/docs/user-manual/security.adoc
@@ -1203,6 +1203,116 @@ admins=system:serviceaccounts:example-ns:admin-sa
 users=system:serviceaccounts:other-ns:test-sa
 ----
 
+==== OIDCLoginModule
+
+OpenID Connect JAAS Login Module performs authentication based on credentials 
sent in the form of https://datatracker.ietf.org/doc/html/rfc7519[Json Web 
Token (JWT)].
+
+This login module doesn't require connection to OpenID Connect provider (like 
https://www.keycloak.org[Keycloak] or 
https://www.microsoft.com/en-us/security/business/identity-access/microsoft-entra-id[Microsoft
 Entra ID]) to perform the authentication. The connection is required only to 
retrieve a list of public keys used to verify signed JWT tokens.
+
+OIDCLoginModule doesn't enforce any particular method of obtaining the tokens 
in the first place. The only requirement is mutual
+trust for the OpenID Connect provider.
+
+JWT tokens can be used in various scenarios involving distributed environments 
where credentials are more sophisticated than plain username and passwords. 
Generally, JWT token include:
+
+* a set of _claims_ which include standard information (like "issuer", 
"authorized party", "subject" or "expiration time") or custom information 
specific to particular OpenID Connect provider (like "set of associated roles" 
or "preferred username").
+* a signature (created using asymmetric or symmetric algorithms) which can be 
used to validate the issuer of the token
+
+OIDCLoginModule has two responsibilities:
+
+1. Periodically (with configured interval) fetching a set of current public 
keys which can be used to verify signed JWT tokens
+2. Validate the JWT token during actual JAAS login process without any access 
to external services and APIs. Entire validation is performed
+offline and involves:
+** validation of JWT signature
+** validation of "not before" and "expires at" claims
+** checking for required claims (with any value)
+** checking for values of configured claims (like "audience")
+** extracting _user identities_ from configurable "JSON paths" which are then 
used as "user principals" of the JAAS subject
+** extracting _user roles_ from configurable "JSON paths" which are then used 
as "role principals" of the JAAS subject
+
+The simplest configuration of OIDC Login Module is:
+
+----
+activemq {
+    org.apache.activemq.artemis.spi.core.security.jaas.OIDCLoginModule required
+        provider="https://openid-provider-host";
+        audience="artemis-broker"
+        ;
+};
+----
+
+Here's the full list of supported options.
+
+debug::
+Enable verbose logging. Details about authentication process will be logged. +
+Defaults to `false`.
+
+userPrincipalClass::
+Implementation of `java.security.Principal` that will be used to collect "user 
principals" for the JAAS subject being authenticated. +
+Defaults to `org.apache.activemq.artemis.spi.core.security.jaas.UserPrincipal`.
+
+rolePrincipalClass::
+Implementation of `java.security.Principal` that will be used to collect "role 
principals" for the JAAS subject being authenticated. +
+Defaults to `org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal`.
+
+provider::
+URL of the OpenID Connect provider (like Keycloak or Entra ID). This URL is a 
_base_ URL. It should be the part of the address which
+can be appended with `/.well-known/openid-configuration`. +
+There's no default provider URL and this parameter is mandatory.
+
+cacheKeysSeconds::
+Public keys are fetched from `jwks_uri` endpoint as specified by 
https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata[OpenID
 Provider Metadata]. This information doesn't change very often, so public keys 
may be safely
+cached for quite a long time. This option specifies the time for which the key 
information may be cached (in seconds). +
+Defaults to `3600` (seconds).
+
+metadataRetrySeconds::
+When the OIDC Login Module is initialized for the first time, OpenID Connect 
provider must be contacted to get information from two endpoints:
+
+* Main metadata from `<provider-url>/.well-known/openid-configuration` - only 
to get the `jwks_uri` endpoint
+* Public key information from `jwks_uri`
+
++
+When a problem occurs during first initialization, `metadataRetrySeconds` 
specifies the delay before the information is fetched again. +
+Defaults to `30` (seconds).
+
+tlsVersion::
+TLS version to use when the provider uses `https` protocol. The value is 
passed to `javax.net.ssl.SSLContext.getInstance()`. +
+Defaults to `TLSv1.3`.
+
+caCertificate::
+Path to a certificate for OpenID Connect provider certificate validation 
(trust). Can be both PEM and DER format.
+There's no default and if the CA is already available in JDK truststore, it 
can be omitted.
+
+httpTimeout::
+Timeout in milliseconds used when connecting to OpenID Connect provider 
(combined connection and read/request timeout). +
+Defaults to `5000` (milliseconds).
+
+allowPlainJWT::
+Option that can be used for test scenarios which allows unsigned JWT tokens to 
be processed (with `{"alg":"none"}` in JWT header). +
+Defaults to `false`.
+
+maxClockSkew::
+Time skew to use when validation expiration time and not-before time for the 
JWT token. +
+Defaults to `60` (seconds).
+
+audience::
+Comma-separated list of values which must be present in the `aud` (_audience_) 
claim of the JWT token. +
+There's no default value.
+
+identityPaths::
+Comma-separated _JSON paths_ that point to the fields (direct or nested) in 
the JWT token which contain values (strings, JSON string
+arrays or whitespace-separated strings) used as _user identities_ (translated 
into `org.apache.activemq.artemis.spi.core.security.jaas.UserPrincipal` 
principals). +
+Defaults to `sub`.
+
+rolesPaths::
+Comma-separated _JSON paths_ that point to the fields (direct or nested) in 
the JWT token which contain values (strings, JSON string
+arrays or whitespace-separated strings) used as _user roles_ (translated into 
`org.apache.activemq.artemis.spi.core.security.jaas.RolePrincipal` principals). 
+
+There's no default value. For Keycloak OpenID Connect provider it could be for 
example `realm_access.roles`.
+
+requireOAuth2MTLS::
+This option adds extra layer of security and enables 
https://datatracker.ietf.org/doc/html/rfc8705[OAuth 2.0 Mutual-TLS Client 
Authentication and Certificate-Bound Access Tokens]. With this option enabled, 
JWT tokens must include `cnf/x5t#256` claim which contains
+a SHA256 digest of client's X.509 certificate. This certificate should match a 
certificate from TLS layer and requires enabled mTLS at the broker level. +
+Defaults to `false`. But when the token is sent with `cnf/x5t#256`, the option 
is ignored and treated as enabled.
+
 === SCRAM-SHA SASL Mechanism
 
 SCRAM (Salted Challenge Response Authentication Mechanism) is an 
authentication mechanism that can establish mutual authentication using 
passwords.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to