Skip to content

Commit def894d

Browse files
committed
Deploying to main from @ b68309a8de69aa0df2b0d77746442e8fa263b4cd 🚀
1 parent 4023cb8 commit def894d

8 files changed

Lines changed: 479 additions & 27 deletions

File tree

2026/01/jwt-authorization-grant.html

Lines changed: 264 additions & 0 deletions
Large diffs are not rendered by default.

blog-archive.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ <h2>2026</h2>
8686

8787
<h3>January</h3>
8888

89+
<ul>
90+
<li><a href="https://www.keycloak.org/2026/01/jwt-authorization-grant">JWT Authorization Grant and Identity Chaining in Keycloak 26.5</a></li>
91+
</ul>
92+
93+
8994
<ul>
9095
<li><a href="https://www.keycloak.org/2026/01/keycloak-2652-released">Keycloak 26.5.2 released</a></li>
9196
</ul>

blog.html

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,23 @@
6868
<div class="jumbotron jumbotron-fluid bg-light kc-bg-triangles pt-4 pb-2">
6969
<div class="container">
7070
<div class="row">
71+
<div class="col-sm-6">
72+
<div class="card shadow-sm mb-4">
73+
<div class="card-body">
74+
<h4 class="card-title" >
75+
JWT Authorization Grant and Identity Chaining in Keycloak 26.5
76+
</h4>
77+
<div class="card-text">Keycloak 26.5 introduces new preview feature: JWT Authorization Grant (RFC 7523), enabling the upcoming OAuth Identity Chaining specification</div>
78+
<a href="https://www.keycloak.org/2026/01/jwt-authorization-grant" class="stretched-link link-dark"></a>
79+
</div>
80+
<div class="card-footer align-items-center d-flex">
81+
<span class="card-subtitle fs-xsmall text-muted">
82+
23 January 2026
83+
by Giuseppe Graziano
84+
</span>
85+
</div>
86+
</div>
87+
</div>
7188
<div class="col-sm-6">
7289
<div class="card shadow-sm mb-4">
7390
<div class="card-body">
@@ -184,23 +201,6 @@ <h4 class="card-title" >
184201
</div>
185202
</div>
186203
</div>
187-
<div class="col-sm-6">
188-
<div class="card shadow-sm mb-4">
189-
<div class="card-body">
190-
<h4 class="card-title" >
191-
Keycloak 26.5.0 released
192-
</h4>
193-
<div class="card-text">JWT Authorization Grant (preview) * Using Keycloak as an authorization server for Model Context Protocol (MCP) servers * CORS enhancements * Logout confirmation page</div>
194-
<a href="https://www.keycloak.org/2026/01/keycloak-2650-released" class="stretched-link link-dark"></a>
195-
</div>
196-
<div class="card-footer align-items-center d-flex">
197-
<span class="card-subtitle fs-xsmall text-muted">
198-
06 January 2026
199-
200-
</span>
201-
</div>
202-
</div>
203-
</div>
204204
</div>
205205
<div class="row">
206206
<div class="col">

index.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,13 @@ <h1 class="display-3 fw-bold">Identity and Access Management</h1>
9393
<div class="row kc-news-section">
9494
<div class="col-md-1 col-sm-12 fw-bold justify-content-center kc-news-item"><a href="https://www.keycloak.org/blog">News</a></div>
9595
<div class="col kc-news-item">
96-
<span class="badge bg-secondary">23 Jan</span> <a href="https://www.keycloak.org/2026/01/keycloak-2652-released">Keycloak 26.5.2 released</a>
96+
<span class="badge bg-secondary">23 Jan</span> <a href="https://www.keycloak.org/2026/01/jwt-authorization-grant">JWT Authorization Grant and Identity Chaining in Keycloak 26.5</a>
9797
</div>
9898
<div class="col kc-news-item">
99-
<span class="badge bg-secondary">19 Jan</span> <a href="https://www.keycloak.org/2026/01/scim-support-survey">SCIM Support Survey</a>
99+
<span class="badge bg-secondary">23 Jan</span> <a href="https://www.keycloak.org/2026/01/keycloak-2652-released">Keycloak 26.5.2 released</a>
100100
</div>
101101
<div class="col kc-news-item">
102-
<span class="badge bg-secondary">16 Jan</span> <a href="https://www.keycloak.org/2026/01/bugbounty-yes-we-hack">Keycloak's Bug Bounty Program on YesWeHack</a>
102+
<span class="badge bg-secondary">19 Jan</span> <a href="https://www.keycloak.org/2026/01/scim-support-survey">SCIM Support Survey</a>
103103
</div>
104104
</div>
105105
</div>

rss.xml

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,187 @@
88
<description>Keycloak Blog</description>
99
<language>en-us</language>
1010
<category>Keycloak/SSO/Identity and Access Management</category>
11+
<item>
12+
<title>JWT Authorization Grant and Identity Chaining in Keycloak 26.5</title>
13+
<link>https://www.keycloak.org/2026/01/jwt-authorization-grant</link>
14+
<description>&lt;div class=&quot;paragraph&quot;&gt;
15+
&lt;p&gt;Modern applications and AI agents increasingly operate across distributed trust domains, where each domain is protected by its own OAuth 2.0 Authorization Server. A single request may also traverse multiple resource servers to complete a task.&lt;/p&gt;
16+
&lt;/div&gt;
17+
&lt;div class=&quot;paragraph&quot;&gt;
18+
&lt;p&gt;This raises an important challenge: every protected resource must understand &lt;strong&gt;who initiated the request&lt;/strong&gt;, which &lt;strong&gt;authorization&lt;/strong&gt; was granted, and optionally which other resources were accessed before making an authorization decision. Preserving this information across domains is critical.&lt;/p&gt;
19+
&lt;/div&gt;
20+
&lt;div class=&quot;paragraph&quot;&gt;
21+
&lt;p&gt;&lt;strong&gt;Keycloak 26.5&lt;/strong&gt; introduces &lt;strong&gt;preview&lt;/strong&gt; support for the new feature &lt;strong&gt;JWT Authorization Grant&lt;/strong&gt;, implementing &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7523&quot;&gt;RFC 7523&lt;/a&gt;. This feature allows a client to present a signed JWT from an external issuer and obtain a Keycloak access token, providing a &lt;strong&gt;standard and secure way to authorize requests based on external assertions&lt;/strong&gt;.&lt;/p&gt;
22+
&lt;/div&gt;
23+
&lt;div class=&quot;paragraph&quot;&gt;
24+
&lt;p&gt;However, exchanging a token alone does not fully solve the problem of propagating identity and authorization context across multiple trust domains.&lt;/p&gt;
25+
&lt;/div&gt;
26+
&lt;div class=&quot;paragraph&quot;&gt;
27+
&lt;p&gt;The IETF draft &lt;strong&gt;OAuth Identity and Authorization Chaining Across Domains&lt;/strong&gt; defines a standardized flow that combines &lt;strong&gt;JWT Authorization Grant (RFC 7523)&lt;/strong&gt; with &lt;strong&gt;OAuth 2.0 Token Exchange (RFC 8693)&lt;/strong&gt;, &lt;strong&gt;which Keycloak already supports&lt;/strong&gt;, to preserve the original user’s identity, claims, and authorization throughout the chain.&lt;/p&gt;
28+
&lt;/div&gt;
29+
&lt;div class=&quot;sect1&quot;&gt;
30+
&lt;h2 id=&quot;_jwt_authorization_grant&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#_jwt_authorization_grant&quot;&gt;&lt;/a&gt;JWT Authorization Grant&lt;/h2&gt;
31+
&lt;div class=&quot;sectionbody&quot;&gt;
32+
&lt;div class=&quot;paragraph&quot;&gt;
33+
&lt;p&gt;The JWT Authorization Grant feature allows a client to present a signed JWT assertion to the token endpoint and obtain an access token without an interactive authorization step. To initiate this flow, the client sends a request to the &lt;strong&gt;token endpoint&lt;/strong&gt; with the &lt;code&gt;grant_type&lt;/code&gt; set to &lt;strong&gt;&lt;code&gt;urn:ietf:params:oauth:grant-type:jwt-bearer&lt;/code&gt;&lt;/strong&gt; and the external token passed in the &lt;strong&gt;&lt;code&gt;assertion&lt;/code&gt;&lt;/strong&gt; parameter.&lt;/p&gt;
34+
&lt;/div&gt;
35+
&lt;div class=&quot;paragraph&quot;&gt;
36+
&lt;p&gt;It provides a standard and secure alternative to the preview feature External-to-Internal Token Exchange V1 which will be deprecated.&lt;/p&gt;
37+
&lt;/div&gt;
38+
&lt;div class=&quot;paragraph&quot;&gt;
39+
&lt;p&gt;Trust relationships in Keycloak are defined through Identity Providers. The JWT Authorization Grant can be enabled and configured in a dedicated section of the existing OpenID Connect v1.0 Identity Provider, or via a new dedicated JWT Authorization Grant Identity Provider.&lt;/p&gt;
40+
&lt;/div&gt;
41+
&lt;div class=&quot;paragraph&quot;&gt;
42+
&lt;p&gt;A confidential client can request a JWT Authorization Grant by enabling the dedicated option in the client settings and selecting the allowed identity providers.&lt;/p&gt;
43+
&lt;/div&gt;
44+
&lt;div class=&quot;admonitionblock note&quot;&gt;
45+
&lt;table&gt;
46+
&lt;tr&gt;
47+
&lt;td class=&quot;icon&quot;&gt;
48+
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
49+
&lt;/td&gt;
50+
&lt;td class=&quot;content&quot;&gt;
51+
The JWT Authorization Grant is a preview feature. Full configuration details are available in a dedicated guide:
52+
&lt;a href=&quot;https://www.keycloak.org/securing-apps/jwt-authorization-grant&quot;&gt;JWT Authorization Grant&lt;/a&gt;.
53+
&lt;/td&gt;
54+
&lt;/tr&gt;
55+
&lt;/table&gt;
56+
&lt;/div&gt;
57+
&lt;/div&gt;
58+
&lt;/div&gt;
59+
&lt;div class=&quot;sect1&quot;&gt;
60+
&lt;h2 id=&quot;_oauth_identity_and_authorization_chaining_across_domains&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#_oauth_identity_and_authorization_chaining_across_domains&quot;&gt;&lt;/a&gt;OAuth Identity and Authorization Chaining Across Domains&lt;/h2&gt;
61+
&lt;div class=&quot;sectionbody&quot;&gt;
62+
&lt;div class=&quot;paragraph&quot;&gt;
63+
&lt;p&gt;Although the JWT Authorization Grant allows a client to obtain a Keycloak access token based on an external JWT, it does not by itself solve the broader problem of propagating identity and authorization context across multiple trust domains.&lt;/p&gt;
64+
&lt;/div&gt;
65+
&lt;div class=&quot;paragraph&quot;&gt;
66+
&lt;p&gt;To propagate identity across multiple trust domains, the &lt;a href=&quot;https://www.keycloak.org/securing-apps/jwt-authorization-grant&quot;&gt;&lt;strong&gt;JWT Authorization Grant&lt;/strong&gt;&lt;/a&gt; (RFC 7523) is combined with &lt;a href=&quot;https://www.keycloak.org/securing-apps/token-exchange#_standard-token-exchange&quot;&gt;&lt;strong&gt;Standard Token Exchange&lt;/strong&gt;&lt;/a&gt; (RFC 8693), already supported by Keycloak.&lt;/p&gt;
67+
&lt;/div&gt;
68+
&lt;div class=&quot;paragraph&quot;&gt;
69+
&lt;p&gt;This integration implements the flow defined in the IETF draft &lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-chaining&quot;&gt;&lt;strong&gt;OAuth Identity and Authorization Chaining Across Domains&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
70+
&lt;/div&gt;
71+
&lt;div class=&quot;paragraph&quot;&gt;
72+
&lt;p&gt;A typical scenario involves &lt;strong&gt;Domain A&lt;/strong&gt; (an external IdP or Keycloak realm) and &lt;strong&gt;Domain B&lt;/strong&gt; (an internal Keycloak realm). The goal is to allow a client in Domain A to access resources in Domain B while preserving the original user&amp;#8217;s identity.&lt;/p&gt;
73+
&lt;/div&gt;
74+
&lt;div class=&quot;sect2&quot;&gt;
75+
&lt;h3 id=&quot;_step_1_token_exchange_in_domain_a&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#_step_1_token_exchange_in_domain_a&quot;&gt;&lt;/a&gt;Step 1: Token Exchange in Domain A&lt;/h3&gt;
76+
&lt;div class=&quot;paragraph&quot;&gt;
77+
&lt;p&gt;In this first step, the client requests a token for Domain B using a Token Exchange request.&lt;/p&gt;
78+
&lt;/div&gt;
79+
&lt;div class=&quot;paragraph&quot;&gt;
80+
&lt;p&gt;The client in Domain A must be configured to allow the target audience, typically by assigning a &lt;strong&gt;Client Scope&lt;/strong&gt; with an &lt;strong&gt;Audience Mapper&lt;/strong&gt; if you are using Keycloak for Domain A. The &lt;code&gt;audience&lt;/code&gt; parameter in the request is then used to &lt;strong&gt;restrict&lt;/strong&gt; the resulting token to that specific target, ensuring it contains the correct &lt;code&gt;aud&lt;/code&gt; claim for Domain B.&lt;/p&gt;
81+
&lt;/div&gt;
82+
&lt;div class=&quot;listingblock&quot;&gt;
83+
&lt;div class=&quot;content&quot;&gt;
84+
&lt;pre class=&quot;highlight&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;# Request to Domain A
85+
POST /realms/domain-a/protocol/openid-connect/token
86+
Content-Type: application/x-www-form-urlencoded
87+
88+
grant_type=urn:ietf:params:oauth:grant-type:token-exchange
89+
&amp;amp;subject_token=$ORIGINAL_ACCESS_TOKEN
90+
&amp;amp;audience=http://localhost:8080/realms/domain-b&lt;/code&gt;&lt;/pre&gt;
91+
&lt;/div&gt;
92+
&lt;/div&gt;
93+
&lt;div class=&quot;paragraph&quot;&gt;
94+
&lt;p&gt;Domain A issues a new JWT access token, which acts as the assertion for Domain B.&lt;/p&gt;
95+
&lt;/div&gt;
96+
&lt;/div&gt;
97+
&lt;div class=&quot;sect2&quot;&gt;
98+
&lt;h3 id=&quot;_step_2_jwt_authorization_grant_in_domain_b&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#_step_2_jwt_authorization_grant_in_domain_b&quot;&gt;&lt;/a&gt;Step 2: JWT Authorization Grant in Domain B&lt;/h3&gt;
99+
&lt;div class=&quot;paragraph&quot;&gt;
100+
&lt;p&gt;The client uses this token to authenticate with Domain B using the &lt;strong&gt;JWT Authorization Grant&lt;/strong&gt;.&lt;/p&gt;
101+
&lt;/div&gt;
102+
&lt;div class=&quot;listingblock&quot;&gt;
103+
&lt;div class=&quot;content&quot;&gt;
104+
&lt;pre class=&quot;highlight&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;# Request to Domain B
105+
POST /realms/domain-b/protocol/openid-connect/token
106+
Content-Type: application/x-www-form-urlencoded
107+
108+
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
109+
&amp;amp;assertion=$TOKEN_FROM_STEP_1&lt;/code&gt;&lt;/pre&gt;
110+
&lt;/div&gt;
111+
&lt;/div&gt;
112+
&lt;div class=&quot;paragraph&quot;&gt;
113+
&lt;p&gt;Domain B validates the token and issues a local access token. Identity and authorization context are now securely propagated from Domain A to Domain B.&lt;/p&gt;
114+
&lt;/div&gt;
115+
&lt;div class=&quot;admonitionblock note&quot;&gt;
116+
&lt;table&gt;
117+
&lt;tr&gt;
118+
&lt;td class=&quot;icon&quot;&gt;
119+
&lt;i class=&quot;fa icon-note&quot; title=&quot;Note&quot;&gt;&lt;/i&gt;
120+
&lt;/td&gt;
121+
&lt;td class=&quot;content&quot;&gt;
122+
This flow can be fully configured with Keycloak. For more configuration details check the dedicated guide:
123+
&lt;a href=&quot;https://www.keycloak.org/nightly/securing-apps/oauth-identity-authorization-chaining-across-domains&quot;&gt;OAuth Identity and Authorization Chaining Across Domains&lt;/a&gt;.
124+
&lt;/td&gt;
125+
&lt;/tr&gt;
126+
&lt;/table&gt;
127+
&lt;/div&gt;
128+
&lt;/div&gt;
129+
&lt;/div&gt;
130+
&lt;/div&gt;
131+
&lt;div class=&quot;sect1&quot;&gt;
132+
&lt;h2 id=&quot;_why_this_new_feature&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#_why_this_new_feature&quot;&gt;&lt;/a&gt;Why this new feature?&lt;/h2&gt;
133+
&lt;div class=&quot;sectionbody&quot;&gt;
134+
&lt;div class=&quot;paragraph&quot;&gt;
135+
&lt;p&gt;The JWT Authorization Grant solves an important problem in cross-domain OAuth flows. It lets an Authorization Server issue tokens based on a &lt;strong&gt;signed JWT assertion&lt;/strong&gt;, making authorization decisions explicit and verifiable. Combined with Identity Chaining, it allows each domain to check and extend authorization context in a standards-based way.&lt;/p&gt;
136+
&lt;/div&gt;
137+
&lt;div class=&quot;paragraph&quot;&gt;
138+
&lt;p&gt;JWT Authorization Grant brings several advantages:&lt;/p&gt;
139+
&lt;/div&gt;
140+
&lt;div class=&quot;ulist&quot;&gt;
141+
&lt;ul&gt;
142+
&lt;li&gt;
143+
&lt;p&gt;&lt;strong&gt;Preserves user identity&lt;/strong&gt;. Cross-domain access often relies on generic service accounts to call APIs. With a signed JWT assertion, a service can request tokens on behalf of a user, keeping identity and intent clear when moving across domains.&lt;/p&gt;
144+
&lt;/li&gt;
145+
&lt;li&gt;
146+
&lt;p&gt;&lt;strong&gt;Standards-based cross-domain support&lt;/strong&gt;. The JWT Authorization Grant with the support of the RFC 7523 is part of ongoing OAuth work on cross-domain identity and authorization chaining, including
147+
&lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-chaining&quot;&gt;OAuth Identity and Authorization Chaining Across Domains&lt;/a&gt; and
148+
&lt;a href=&quot;https://datatracker.ietf.org/doc/draft-ietf-oauth-identity-assertion-authz-grant&quot;&gt;Identity Assertion Authorization Grant&lt;/a&gt;.
149+
This allows workflows that are traceable, constrained, and aligned with least-privilege principles, ideal for distributed systems and AI agents.&lt;/p&gt;
150+
&lt;/li&gt;
151+
&lt;/ul&gt;
152+
&lt;/div&gt;
153+
&lt;/div&gt;
154+
&lt;/div&gt;
155+
&lt;div class=&quot;sect1&quot;&gt;
156+
&lt;h2 id=&quot;_next_steps&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#_next_steps&quot;&gt;&lt;/a&gt;Next Steps&lt;/h2&gt;
157+
&lt;div class=&quot;sectionbody&quot;&gt;
158+
&lt;div class=&quot;ulist&quot;&gt;
159+
&lt;ul&gt;
160+
&lt;li&gt;
161+
&lt;p&gt;Promote JWT Authorization Grant from preview to a fully supported feature in the next Keycloak release&lt;/p&gt;
162+
&lt;/li&gt;
163+
&lt;li&gt;
164+
&lt;p&gt;Deprecate Token Exchange version 1&lt;/p&gt;
165+
&lt;/li&gt;
166+
&lt;li&gt;
167+
&lt;p&gt;Enable JWT Authorization Grant for social Identity Providers (e.g., Google)&lt;/p&gt;
168+
&lt;/li&gt;
169+
&lt;li&gt;
170+
&lt;p&gt;Monitor and follow the evolution of the Identity Chaining draft to ensure full compliance&lt;/p&gt;
171+
&lt;/li&gt;
172+
&lt;/ul&gt;
173+
&lt;/div&gt;
174+
&lt;/div&gt;
175+
&lt;/div&gt;
176+
&lt;div class=&quot;sect1&quot;&gt;
177+
&lt;h2 id=&quot;_try_it_out&quot;&gt;&lt;a class=&quot;anchor&quot; href=&quot;#_try_it_out&quot;&gt;&lt;/a&gt;Try It Out&lt;/h2&gt;
178+
&lt;div class=&quot;sectionbody&quot;&gt;
179+
&lt;div class=&quot;paragraph&quot;&gt;
180+
&lt;p&gt;As the &lt;strong&gt;JWT Authorization Grant&lt;/strong&gt; is currently in &lt;strong&gt;preview&lt;/strong&gt;, your feedback is helpful to help to refine the feature before it reaches full support.&lt;/p&gt;
181+
&lt;/div&gt;
182+
&lt;div class=&quot;paragraph&quot;&gt;
183+
&lt;p&gt;We encourage you to test this new feature and share your experience. Feedback and contributions from the community are always welcome.&lt;/p&gt;
184+
&lt;/div&gt;
185+
&lt;/div&gt;
186+
&lt;/div&gt;</description>
187+
<guid>https://www.keycloak.org/2026/01/jwt-authorization-grant</guid>
188+
<pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
189+
190+
<author>Giuseppe Graziano</author>
191+
</item>
11192
<item>
12193
<title>Keycloak 26.5.2 released</title>
13194
<link>https://www.keycloak.org/2026/01/keycloak-2652-released</link>

0 commit comments

Comments
 (0)