@@ -44,9 +44,13 @@ async def user_verify(db: AsyncSession, username: str, password: str) -> User:
4444 async def swagger_login (self , * , obj : HTTPBasicCredentials ) -> tuple [str , User ]:
4545 async with async_db_session .begin () as db :
4646 user = await self .user_verify (db , obj .username , obj .password )
47- user_id = user .id
48- a_token = await create_access_token (str (user_id ), user .is_multi_login )
4947 await user_dao .update_login_time (db , obj .username )
48+ a_token = await create_access_token (
49+ str (user .id ),
50+ user .is_multi_login ,
51+ # extra info
52+ login_type = 'swagger' ,
53+ )
5054 return a_token .access_token , user
5155
5256 async def login (
@@ -61,9 +65,29 @@ async def login(
6165 raise errors .AuthorizationError (msg = '验证码失效,请重新获取' )
6266 if captcha_code .lower () != obj .captcha .lower ():
6367 raise errors .CustomError (error = CustomErrorCode .CAPTCHA_ERROR )
64- user_id = user .id
65- a_token = await create_access_token (str (user_id ), user .is_multi_login )
66- r_token = await create_refresh_token (str (user_id ), user .is_multi_login )
68+ await redis_client .delete (f'{ admin_settings .CAPTCHA_LOGIN_REDIS_PREFIX } :{ request .state .ip } ' )
69+ await user_dao .update_login_time (db , obj .username )
70+ await db .refresh (user )
71+ a_token = await create_access_token (
72+ str (user .id ),
73+ user .is_multi_login ,
74+ # extra info
75+ username = user .username ,
76+ nickname = user .nickname ,
77+ last_login_time = timezone .t_str (user .last_login_time ),
78+ ip = request .state .ip ,
79+ os = request .state .os ,
80+ browser = request .state .browser ,
81+ device = request .state .device ,
82+ )
83+ r_token = await create_refresh_token (str (user .id ), user .is_multi_login )
84+ response .set_cookie (
85+ key = settings .COOKIE_REFRESH_TOKEN_KEY ,
86+ value = r_token .refresh_token ,
87+ max_age = settings .COOKIE_REFRESH_TOKEN_EXPIRE_SECONDS ,
88+ expires = timezone .f_utc (r_token .refresh_token_expire_time ),
89+ httponly = True ,
90+ )
6791 except errors .NotFoundError as e :
6892 log .error ('登陆错误: 用户名不存在' )
6993 raise errors .NotFoundError (msg = e .msg )
@@ -99,19 +123,10 @@ async def login(
99123 msg = '登录成功' ,
100124 ),
101125 )
102- await redis_client .delete (f'{ admin_settings .CAPTCHA_LOGIN_REDIS_PREFIX } :{ request .state .ip } ' )
103- await user_dao .update_login_time (db , obj .username )
104- response .set_cookie (
105- key = settings .COOKIE_REFRESH_TOKEN_KEY ,
106- value = r_token .refresh_token ,
107- max_age = settings .COOKIE_REFRESH_TOKEN_EXPIRE_SECONDS ,
108- expires = timezone .f_utc (r_token .refresh_token_expire_time ),
109- httponly = True ,
110- )
111- await db .refresh (user )
112126 data = GetLoginToken (
113127 access_token = a_token .access_token ,
114128 access_token_expire_time = a_token .access_token_expire_time ,
129+ session_uuid = a_token .session_uuid ,
115130 user = user , # type: ignore
116131 )
117132 return data
@@ -122,23 +137,31 @@ async def new_token(*, request: Request, response: Response) -> GetNewToken:
122137 if not refresh_token :
123138 raise errors .TokenError (msg = 'Refresh Token 丢失,请重新登录' )
124139 try :
125- user_id = jwt_decode (refresh_token )
140+ user_id = jwt_decode (refresh_token ). id
126141 except Exception :
127142 raise errors .TokenError (msg = 'Refresh Token 无效' )
128143 if request .user .id != user_id :
129144 raise errors .TokenError (msg = 'Refresh Token 无效' )
130145 async with async_db_session () as db :
146+ token = get_token (request )
131147 user = await user_dao .get (db , user_id )
132148 if not user :
133149 raise errors .NotFoundError (msg = '用户名或密码有误' )
134150 elif not user .status :
135151 raise errors .AuthorizationError (msg = '用户已被锁定, 请联系统管理员' )
136- current_token = get_token (request )
137152 new_token = await create_new_token (
138- sub = str (user .id ),
139- token = current_token ,
153+ user_id = str (user .id ),
154+ token = token ,
140155 refresh_token = refresh_token ,
141156 multi_login = user .is_multi_login ,
157+ # extra info
158+ username = user .username ,
159+ nickname = user .nickname ,
160+ last_login_time = timezone .t_str (user .last_login_time ),
161+ ip = request .state .ip ,
162+ os = request .state .os ,
163+ browser = request .state .browser ,
164+ device_type = request .state .device ,
142165 )
143166 response .set_cookie (
144167 key = settings .COOKIE_REFRESH_TOKEN_KEY ,
@@ -150,25 +173,28 @@ async def new_token(*, request: Request, response: Response) -> GetNewToken:
150173 data = GetNewToken (
151174 access_token = new_token .new_access_token ,
152175 access_token_expire_time = new_token .new_access_token_expire_time ,
176+ session_uuid = new_token .session_uuid ,
153177 )
154178 return data
155179
156180 @staticmethod
157181 async def logout (* , request : Request , response : Response ) -> None :
158182 token = get_token (request )
183+ token_payload = jwt_decode (token )
184+ user_id = token_payload .id
159185 refresh_token = request .cookies .get (settings .COOKIE_REFRESH_TOKEN_KEY )
160186 response .delete_cookie (settings .COOKIE_REFRESH_TOKEN_KEY )
161187 if request .user .is_multi_login :
162- key = f'{ settings .TOKEN_REDIS_PREFIX } :{ request .user .id } :{ token } '
163- await redis_client .delete (key )
188+ await redis_client .delete (f'{ settings .TOKEN_REDIS_PREFIX } :{ user_id } :{ token_payload .session_uuid } ' )
164189 if refresh_token :
165- key = f'{ settings .TOKEN_REFRESH_REDIS_PREFIX } :{ request .user .id } :{ refresh_token } '
166- await redis_client .delete (key )
190+ await redis_client .delete (f'{ settings .TOKEN_REFRESH_REDIS_PREFIX } :{ user_id } :{ refresh_token } ' )
167191 else :
168- key_prefix = f'{ settings .TOKEN_REDIS_PREFIX } :{ request .user .id } :'
169- await redis_client .delete_prefix (key_prefix )
170- key_prefix = f'{ settings .TOKEN_REFRESH_REDIS_PREFIX } :{ request .user .id } :'
171- await redis_client .delete_prefix (key_prefix )
192+ key_prefix = [
193+ f'{ settings .TOKEN_REDIS_PREFIX } :{ user_id } :' ,
194+ f'{ settings .TOKEN_REFRESH_REDIS_PREFIX } :{ user_id } :' ,
195+ ]
196+ for prefix in key_prefix :
197+ await redis_client .delete_prefix (prefix )
172198
173199
174200auth_service : AuthService = AuthService ()
0 commit comments