2323
2424from airflow .api_fastapi .app import get_auth_manager
2525from airflow .api_fastapi .auth .managers .base_auth_manager import COOKIE_NAME_JWT_TOKEN
26+ from airflow .api_fastapi .auth .managers .exceptions import AuthManagerRefreshTokenExpiredException
2627from airflow .api_fastapi .auth .managers .models .base_user import BaseUser
2728from airflow .api_fastapi .core_api .security import resolve_user_from_token
2829from airflow .configuration import conf
@@ -40,26 +41,34 @@ class JWTRefreshMiddleware(BaseHTTPMiddleware):
4041 """
4142
4243 async def dispatch (self , request : Request , call_next ):
43- new_user = None
44+ new_token = None
4445 current_token = request .cookies .get (COOKIE_NAME_JWT_TOKEN )
4546 try :
46- if current_token :
47- new_user , current_user = await self ._refresh_user (current_token )
48- if user := (new_user or current_user ):
49- request .state .user = user
47+ if current_token is not None :
48+ try :
49+ new_user , current_user = await self ._refresh_user (current_token )
50+ if user := (new_user or current_user ):
51+ request .state .user = user
52+ if new_user :
53+ # If we created a new user, serialize it and set it as a cookie
54+ new_token = get_auth_manager ().generate_jwt (new_user )
55+ except (HTTPException , AuthManagerRefreshTokenExpiredException ):
56+ # Receive a HTTPException when the Airflow token is expired
57+ # Receive a AuthManagerRefreshTokenExpiredException when the potential underlying refresh
58+ # token used by the auth manager is expired
59+ new_token = ""
5060
5161 response = await call_next (request )
5262
53- if new_user :
54- # If we created a new user, serialize it and set it as a cookie
55- new_token = get_auth_manager ().generate_jwt (new_user )
63+ if new_token is not None :
5664 secure = bool (conf .get ("api" , "ssl_cert" , fallback = "" ))
5765 response .set_cookie (
5866 COOKIE_NAME_JWT_TOKEN ,
5967 new_token ,
6068 httponly = True ,
6169 secure = secure ,
6270 samesite = "lax" ,
71+ max_age = 0 if new_token == "" else None ,
6372 )
6473 except HTTPException as exc :
6574 # If any HTTPException is raised during user resolution or refresh, return it as response
@@ -68,9 +77,5 @@ async def dispatch(self, request: Request, call_next):
6877
6978 @staticmethod
7079 async def _refresh_user (current_token : str ) -> tuple [BaseUser | None , BaseUser | None ]:
71- try :
72- user = await resolve_user_from_token (current_token )
73- except HTTPException :
74- return None , None
75-
80+ user = await resolve_user_from_token (current_token )
7681 return get_auth_manager ().refresh_user (user = user ), user
0 commit comments