@@ -44,9 +44,13 @@ async def user_verify(db: AsyncSession, username: str, password: str) -> User:
44
44
async def swagger_login (self , * , obj : HTTPBasicCredentials ) -> tuple [str , User ]:
45
45
async with async_db_session .begin () as db :
46
46
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 )
49
47
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
+ )
50
54
return a_token .access_token , user
51
55
52
56
async def login (
@@ -61,9 +65,29 @@ async def login(
61
65
raise errors .AuthorizationError (msg = '验证码失效,请重新获取' )
62
66
if captcha_code .lower () != obj .captcha .lower ():
63
67
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
+ )
67
91
except errors .NotFoundError as e :
68
92
log .error ('登陆错误: 用户名不存在' )
69
93
raise errors .NotFoundError (msg = e .msg )
@@ -99,19 +123,10 @@ async def login(
99
123
msg = '登录成功' ,
100
124
),
101
125
)
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 )
112
126
data = GetLoginToken (
113
127
access_token = a_token .access_token ,
114
128
access_token_expire_time = a_token .access_token_expire_time ,
129
+ session_uuid = a_token .session_uuid ,
115
130
user = user , # type: ignore
116
131
)
117
132
return data
@@ -122,23 +137,31 @@ async def new_token(*, request: Request, response: Response) -> GetNewToken:
122
137
if not refresh_token :
123
138
raise errors .TokenError (msg = 'Refresh Token 丢失,请重新登录' )
124
139
try :
125
- user_id = jwt_decode (refresh_token )
140
+ user_id = jwt_decode (refresh_token ). id
126
141
except Exception :
127
142
raise errors .TokenError (msg = 'Refresh Token 无效' )
128
143
if request .user .id != user_id :
129
144
raise errors .TokenError (msg = 'Refresh Token 无效' )
130
145
async with async_db_session () as db :
146
+ token = get_token (request )
131
147
user = await user_dao .get (db , user_id )
132
148
if not user :
133
149
raise errors .NotFoundError (msg = '用户名或密码有误' )
134
150
elif not user .status :
135
151
raise errors .AuthorizationError (msg = '用户已被锁定, 请联系统管理员' )
136
- current_token = get_token (request )
137
152
new_token = await create_new_token (
138
- sub = str (user .id ),
139
- token = current_token ,
153
+ user_id = str (user .id ),
154
+ token = token ,
140
155
refresh_token = refresh_token ,
141
156
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 ,
142
165
)
143
166
response .set_cookie (
144
167
key = settings .COOKIE_REFRESH_TOKEN_KEY ,
@@ -150,25 +173,28 @@ async def new_token(*, request: Request, response: Response) -> GetNewToken:
150
173
data = GetNewToken (
151
174
access_token = new_token .new_access_token ,
152
175
access_token_expire_time = new_token .new_access_token_expire_time ,
176
+ session_uuid = new_token .session_uuid ,
153
177
)
154
178
return data
155
179
156
180
@staticmethod
157
181
async def logout (* , request : Request , response : Response ) -> None :
158
182
token = get_token (request )
183
+ token_payload = jwt_decode (token )
184
+ user_id = token_payload .id
159
185
refresh_token = request .cookies .get (settings .COOKIE_REFRESH_TOKEN_KEY )
160
186
response .delete_cookie (settings .COOKIE_REFRESH_TOKEN_KEY )
161
187
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 } ' )
164
189
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 } ' )
167
191
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 )
172
198
173
199
174
200
auth_service : AuthService = AuthService ()
0 commit comments