This is an automated email from the ASF dual-hosted git repository.
vincbeck pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new f8ff3cc2203 Check `id_token` format before redirecting in Keycloak
auth manager (#62813)
f8ff3cc2203 is described below
commit f8ff3cc2203edbf1dc4e12669c0594f6f1466fd4
Author: Vincent <[email protected]>
AuthorDate: Tue Mar 3 15:30:58 2026 -0500
Check `id_token` format before redirecting in Keycloak auth manager (#62813)
---
.../src/airflow/providers/keycloak/auth_manager/routes/login.py | 3 ++-
.../keycloak/tests/unit/keycloak/auth_manager/routes/test_login.py | 6 +++++-
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git
a/providers/keycloak/src/airflow/providers/keycloak/auth_manager/routes/login.py
b/providers/keycloak/src/airflow/providers/keycloak/auth_manager/routes/login.py
index 941f6d21dd4..7c2c4b5e250 100644
---
a/providers/keycloak/src/airflow/providers/keycloak/auth_manager/routes/login.py
+++
b/providers/keycloak/src/airflow/providers/keycloak/auth_manager/routes/login.py
@@ -121,7 +121,8 @@ def logout(request: Request):
base_url = conf.get("api", "base_url", fallback="/")
post_logout_redirect_uri = urljoin(base_url,
f"{AUTH_MANAGER_FASTAPI_APP_PREFIX}/logout_callback")
- if id_token:
+ # Validate id_token format before using in redirect (JWT tokens have 3
parts separated by dots)
+ if id_token and id_token.count(".") == 2 and all(c.isalnum() or c in ".-_"
for c in id_token):
encoded_id_token = quote(id_token, safe="")
logout_url = (
f"{end_session_endpoint}?post_logout_redirect_uri={post_logout_redirect_uri}"
diff --git
a/providers/keycloak/tests/unit/keycloak/auth_manager/routes/test_login.py
b/providers/keycloak/tests/unit/keycloak/auth_manager/routes/test_login.py
index 834fee5f0ae..fd235ea46be 100644
--- a/providers/keycloak/tests/unit/keycloak/auth_manager/routes/test_login.py
+++ b/providers/keycloak/tests/unit/keycloak/auth_manager/routes/test_login.py
@@ -85,7 +85,11 @@ class TestLoginRouter:
(None, "/auth/logout_callback"),
(
"id_token",
-
"logout_url?post_logout_redirect_uri=/auth/logout_callback&id_token_hint=id_token",
+ "/auth/logout_callback",
+ ),
+ (
+ "id_token.real.value",
+
"logout_url?post_logout_redirect_uri=/auth/logout_callback&id_token_hint=id_token.real.value",
),
],
)