1212from services .user_management_service import get_authorized_client , validate_token , \
1313 check_auth_service_health , signup_user , signin_user , refresh_user_token , \
1414 get_session_by_authorization
15+ from consts .exceptions import UnauthorizedError
1516from utils .auth_utils import get_current_user_id
1617
1718
@@ -123,12 +124,16 @@ async def user_refresh_token(request: Request):
123124async def logout (request : Request ):
124125 """User logout"""
125126 authorization = request .headers .get ("Authorization" )
126- if not authorization :
127- raise HTTPException (status_code = HTTPStatus .UNAUTHORIZED ,
128- detail = "User not logged in" )
129127 try :
130- client = get_authorized_client (authorization )
131- client .auth .sign_out ()
128+ # Make logout idempotent: if no token or token expired, still return success
129+ if authorization :
130+ client = get_authorized_client (authorization )
131+ try :
132+ client .auth .sign_out ()
133+ except Exception as signout_err :
134+ # Ignore sign out errors to keep logout idempotent
135+ logging .warning (
136+ f"Sign out encountered an error but will be ignored: { str (signout_err )} " )
132137 return JSONResponse (status_code = HTTPStatus .OK ,
133138 content = {"message" :"Logout successful" })
134139
@@ -143,17 +148,19 @@ async def get_session(request: Request):
143148 """Get current user session"""
144149 authorization = request .headers .get ("Authorization" )
145150 if not authorization :
146- raise HTTPException (status_code = HTTPStatus .UNAUTHORIZED ,
147- detail = "User not logged in" )
151+ # Treat as not logged in when missing token
152+ return JSONResponse (status_code = HTTPStatus .OK ,
153+ content = {"message" : "User not logged in" ,
154+ "data" : None })
148155 try :
149156 data = await get_session_by_authorization (authorization )
150157 return JSONResponse (status_code = HTTPStatus .OK ,
151158 content = {"message" : "Session is valid" ,
152159 "data" : data })
153- except ValueError as e :
154- logging .error (f"Get user session failed : { str (e )} " )
155- raise HTTPException (status_code = HTTPStatus .UNPROCESSABLE_ENTITY ,
156- detail = "Session is invalid" )
160+ except UnauthorizedError as e :
161+ logging .error (f"Get user session unauthorized : { str (e )} " )
162+ raise HTTPException (status_code = HTTPStatus .UNAUTHORIZED ,
163+ detail = "User not logged in or session invalid" )
157164 except Exception as e :
158165 logging .error (f"error in get user session, { str (e )} " )
159166 raise HTTPException (status_code = HTTPStatus .INTERNAL_SERVER_ERROR ,
@@ -165,8 +172,10 @@ async def get_user_id(request: Request):
165172 """Get current user ID, return None if not logged in"""
166173 authorization = request .headers .get ("Authorization" )
167174 if not authorization :
168- raise HTTPException (status_code = HTTPStatus .UNAUTHORIZED ,
169- detail = "User not logged in" )
175+ # Treat as not logged in when missing token, return 200 with null user_id
176+ return JSONResponse (status_code = HTTPStatus .OK ,
177+ content = {"message" : "User not logged in" ,
178+ "data" : {"user_id" : None }})
170179 try :
171180 # Use the unified token validation function
172181 is_valid , user = validate_token (authorization )
0 commit comments