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 2ece6fd2928 Fix Airflow JWT getting cleared in /login_callback (#71077)
2ece6fd2928 is described below

commit 2ece6fd2928146f12c59be97a21812a2c29b8633
Author: stephen-bracken <[email protected]>
AuthorDate: Mon Aug 10 14:55:51 2026 +0100

    Fix Airflow JWT getting cleared in /login_callback (#71077)
---
 .../airflow/providers/keycloak/auth_manager/middleware.py  | 14 ++++++++------
 .../tests/unit/keycloak/auth_manager/test_middleware.py    |  3 ++-
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git 
a/providers/keycloak/src/airflow/providers/keycloak/auth_manager/middleware.py 
b/providers/keycloak/src/airflow/providers/keycloak/auth_manager/middleware.py
index fcbfc56f044..1ad6f1eafa9 100644
--- 
a/providers/keycloak/src/airflow/providers/keycloak/auth_manager/middleware.py
+++ 
b/providers/keycloak/src/airflow/providers/keycloak/auth_manager/middleware.py
@@ -78,8 +78,6 @@ class KeycloakJWTMiddleware(BaseHTTPMiddleware):
                 user = new_user or current_user
             except (
                 AuthManagerRefreshTokenExpiredException,
-                ExpiredSignatureError,
-                InvalidTokenError,
                 HTTPException,
             ):
                 new_token = ""
@@ -234,13 +232,17 @@ class KeycloakJWTMiddleware(BaseHTTPMiddleware):
         access_token = request.cookies.get(COOKIE_NAME_ACCESS_TOKEN)
         refresh_token = request.cookies.get(COOKIE_NAME_REFRESH_TOKEN)
         if not jwt_token:
-            raise HTTPException(
-                status_code=status.HTTP_401_UNAUTHORIZED, detail="User is not 
logged into Airflow."
-            )
+            # User is not logged into Airflow
+            return None, None
         if not access_token:
             raise HTTPException(
                 status_code=status.HTTP_401_UNAUTHORIZED, detail="User is not 
logged into Keycloak."
             )
         auth_manager = cast("KeycloakAuthManager", get_auth_manager())
-        user = await auth_manager.get_user_from_token(jwt_token, access_token, 
refresh_token)
+        try:
+            user = await auth_manager.get_user_from_token(jwt_token, 
access_token, refresh_token)
+        except ExpiredSignatureError:
+            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, 
detail="Token Expired")
+        except InvalidTokenError:
+            raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, 
detail="Invalid JWT token")
         return get_auth_manager().refresh_user(user=user), user
diff --git 
a/providers/keycloak/tests/unit/keycloak/auth_manager/test_middleware.py 
b/providers/keycloak/tests/unit/keycloak/auth_manager/test_middleware.py
index 29a72988823..66f610ae308 100644
--- a/providers/keycloak/tests/unit/keycloak/auth_manager/test_middleware.py
+++ b/providers/keycloak/tests/unit/keycloak/auth_manager/test_middleware.py
@@ -239,7 +239,7 @@ class TestKeycloakJWTMiddleware:
             COOKIE_NAME_REFRESH_TOKEN: "refresh_token",
         }
 
-        await middleware.dispatch(mock_request, call_next)
+        response = await middleware.dispatch(mock_request, call_next)
 
         auth_manager.get_user_from_token.assert_not_called()
         auth_manager.refresh_user.assert_not_called()
@@ -258,6 +258,7 @@ class TestKeycloakJWTMiddleware:
             assert not hasattr(mock_request.state, "user_authenticated_via")
 
         call_next.assert_awaited_once_with(mock_request)
+        response.set_cookie.assert_not_called()
 
     
@patch("airflow.providers.keycloak.auth_manager.middleware.get_auth_manager")
     @pytest.mark.asyncio

Reply via email to