Release date 2026/09/15
Feature
Added actor token support to token exchange. Configure
token_exchange.request.actor_tokento include an actor token, read from a request header or a static token value, in the token exchange request.Added
protected_resource_metadataconfiguration to support RFC 9728 OAuth 2.0 Protected Resource Metadata, enabling automatic authorization server discovery by serving a well-known metadata document and enrichingWWW-Authenticatechallenge headers withresource_metadataandscopeattributes.Added support for Microsoft Entra ID’s On-Behalf-Of flow through a new
token_exchange.grant_type = jwt_bearer(RFC 7523) mode, plusmap_identities_fromandtoken_exchange.provider.KONG_FIPS=onno longer generates default EdDSA JWKS keys. Use an RSA-PSS or NIST-curve ECDSA key instead.If you are migrating from the FIPS package to the FIPS 3 package for compliance with FIPS 140-3, please note that this is a breaking change in the standard that requires your manual intervention.
Bugfix
Fixed an issue where
token_exchangescope and audience conditions matched only the claimsscopeandaud. Support forscopes_claim/audience_claimis now added totoken_exchange.Fixed an issue where a request that authenticated but failed an authorization check (such as
scopes_required) was not attributed to its consumer, consumer groups, or Kong Identity principal in logs and analytics.Fixed an issue where a revoked or inactive token from the introspection endpoint was cached using the default/positive TTL instead of
cache_ttl_neg, keeping the token marked inactive in the cache longer than configured.Fixed an issue where the
redirect_uriparameter was sent to the token endpoint for all grant types. It is now included only for theauthorization_codegrant, as required by RFC 6749.Fixed an issue where a token endpoint response with
expires_in <= 0was cached indefinitely with the proactive expiry re-check disabled, causing the plugin to silently forward an already-expired token to the upstream until a worker/process restart.Fixed an issue where
token_endpoint_auth_method, custom token headers, and extra token POST args were ignored during token exchange, causing the exchange request to always useclient_secret_basicregardless of configuration.Fixed an issue where
token_exchange.cachedefaulted to disabled instead of its documented enabled default when omitted.Fixed an issue where a session was not saved on a request that performed a token exchange. A session-restored request now reuses the exchanged identity instead of re-exchanging.
Fixed an issue where disabling
verify_signaturegave no warning, even though it also skips signature verification for bearer tokens from clients. The plugin now logs a warning whenverify_signatureisfalseandauth_methodsincludesbearer. It logs a notice instead whenbeareris not enabled.token_exchange.subject_token_issuersentries for a different issuer now also warn when they don’t setverify_signaturetotrue.Fixed an issue where switching clients within a single request (via
client_arg) failed to use the matching client’s JWK.Fixed an issue where consumer groups could not be resolved when the groups claim was only available from the user info endpoint, which resulted in a
500error.Fixed the token exchange cache to stop outliving its subject token, mixing entries across
grant_type/provider/client, and serving stale results after a plugin update under incremental config sync. Usecache_tokens_saltto scope the cache further.The
ignore_signatureoption now logs a warning when it is set, because it turns off JWS signature verification for the listed grants.