处理中间件异常问题
This commit is contained in:
+5
-24
@@ -1,7 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime
|
||||||
from typing import Any, Dict
|
from typing import Any, Dict
|
||||||
|
|
||||||
import jwt
|
import jwt
|
||||||
@@ -82,7 +82,7 @@ class JwtAuthMiddleware(BaseHTTPMiddleware):
|
|||||||
if redis_client is None:
|
if redis_client is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
redis_key = f"login:token:{user_id}"
|
redis_key = f"client:login:token:{user_id}"
|
||||||
raw = await redis_client.get(redis_key)
|
raw = await redis_client.get(redis_key)
|
||||||
if not raw:
|
if not raw:
|
||||||
return
|
return
|
||||||
@@ -90,30 +90,11 @@ class JwtAuthMiddleware(BaseHTTPMiddleware):
|
|||||||
info = json.loads(raw) if isinstance(raw, str) else raw
|
info = json.loads(raw) if isinstance(raw, str) else raw
|
||||||
devices = info.get("loginDevices", [])
|
devices = info.get("loginDevices", [])
|
||||||
|
|
||||||
# 过滤过期设备
|
# 校验当前设备是否在列表中
|
||||||
now = datetime.now(timezone.utc)
|
device_uuids = {d["uuId"] for d in devices}
|
||||||
valid_devices = []
|
if uu_id not in device_uuids:
|
||||||
for d in devices:
|
|
||||||
last_login_str = d["lastLoginTime"]
|
|
||||||
# 兼容 Java Instant 格式(尾部 Z)
|
|
||||||
if last_login_str.endswith("Z"):
|
|
||||||
last_login_str = last_login_str[:-1] + "+00:00"
|
|
||||||
last_login = datetime.fromisoformat(last_login_str)
|
|
||||||
if last_login.tzinfo is None:
|
|
||||||
last_login = last_login.replace(tzinfo=timezone.utc)
|
|
||||||
if (now - last_login).total_seconds() < settings.token_expire_seconds:
|
|
||||||
valid_devices.append(d)
|
|
||||||
|
|
||||||
# 校验当前设备
|
|
||||||
device_map = {d["uuId"]: d for d in valid_devices}
|
|
||||||
if uu_id not in device_map:
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# 续期
|
|
||||||
device_map[uu_id]["lastLoginTime"] = now.isoformat()
|
|
||||||
info["loginDevices"] = valid_devices
|
|
||||||
await redis_client.set(redis_key, json.dumps(info), ex=settings.token_expire_seconds)
|
|
||||||
|
|
||||||
RequestContext.user_id.set(int(user_id))
|
RequestContext.user_id.set(int(user_id))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user