99from module .security .api import (
1010 active_user ,
1111 auth_user ,
12+ check_login_ip ,
1213 get_current_user ,
1314 update_user_info ,
1415)
1819
1920router = APIRouter (prefix = "/auth" , tags = ["auth" ])
2021
22+ _TOKEN_EXPIRY_DAYS = 1
23+ _TOKEN_MAX_AGE = 86400
2124
22- @router .post ("/login" , response_model = dict )
25+
26+ def _issue_token (username : str , response : Response ) -> dict :
27+ """Create a JWT, set it as an HttpOnly cookie, and return the bearer payload."""
28+ token = create_access_token (
29+ data = {"sub" : username }, expires_delta = timedelta (days = _TOKEN_EXPIRY_DAYS )
30+ )
31+ response .set_cookie (key = "token" , value = token , httponly = True , max_age = _TOKEN_MAX_AGE )
32+ return {"access_token" : token , "token_type" : "bearer" }
33+
34+
35+ @router .post ("/login" , response_model = dict , dependencies = [Depends (check_login_ip )])
2336async def login (response : Response , form_data = Depends (OAuth2PasswordRequestForm )):
37+ """Authenticate with username/password and issue a session token."""
2438 user = User (username = form_data .username , password = form_data .password )
2539 resp = auth_user (user )
2640 if resp .status :
27- token = create_access_token (
28- data = {"sub" : user .username }, expires_delta = timedelta (days = 1 )
29- )
30- response .set_cookie (key = "token" , value = token , httponly = True , max_age = 86400 )
31- return {"access_token" : token , "token_type" : "bearer" }
41+ return _issue_token (user .username , response )
3242 return u_response (resp )
3343
3444
3545@router .get (
3646 "/refresh_token" , response_model = dict , dependencies = [Depends (get_current_user )]
3747)
3848async def refresh (response : Response , token : str = Cookie (None )):
49+ """Refresh the current session token and update the active-user timestamp."""
3950 payload = decode_token (token )
4051 username = payload .get ("sub" ) if payload else None
4152 if not username :
4253 raise HTTPException (
4354 status_code = status .HTTP_401_UNAUTHORIZED , detail = "Unauthorized"
4455 )
4556 active_user [username ] = datetime .now ()
46- new_token = create_access_token (
47- data = {"sub" : username }, expires_delta = timedelta (days = 1 )
48- )
49- response .set_cookie (key = "token" , value = new_token , httponly = True , max_age = 86400 )
50- return {"access_token" : new_token , "token_type" : "bearer" }
57+ return _issue_token (username , response )
5158
5259
5360@router .get (
5461 "/logout" , response_model = APIResponse , dependencies = [Depends (get_current_user )]
5562)
5663async def logout (response : Response , token : str = Cookie (None )):
64+ """Invalidate the session and clear the token cookie."""
5765 payload = decode_token (token )
5866 username = payload .get ("sub" ) if payload else None
5967 if username :
@@ -69,24 +77,12 @@ async def logout(response: Response, token: str = Cookie(None)):
6977async def update_user (
7078 user_data : UserUpdate , response : Response , token : str = Cookie (None )
7179):
80+ """Update credentials for the current user and re-issue a fresh token."""
7281 payload = decode_token (token )
7382 old_user = payload .get ("sub" ) if payload else None
7483 if not old_user :
7584 raise HTTPException (
7685 status_code = status .HTTP_401_UNAUTHORIZED , detail = "Unauthorized"
7786 )
7887 if update_user_info (user_data , old_user ):
79- token = create_access_token (
80- data = {"sub" : old_user }, expires_delta = timedelta (days = 1 )
81- )
82- response .set_cookie (
83- key = "token" ,
84- value = token ,
85- httponly = True ,
86- max_age = 86400 ,
87- )
88- return {
89- "access_token" : token ,
90- "token_type" : "bearer" ,
91- "message" : "update success" ,
92- }
88+ return {** _issue_token (old_user , response ), "message" : "update success" }
0 commit comments