处理中间件异常问题
This commit is contained in:
+5
-24
@@ -1,7 +1,7 @@
|
||||
import json
|
||||
import re
|
||||
import time
|
||||
from datetime import datetime, timezone
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict
|
||||
|
||||
import jwt
|
||||
@@ -82,7 +82,7 @@ class JwtAuthMiddleware(BaseHTTPMiddleware):
|
||||
if redis_client is None:
|
||||
return
|
||||
|
||||
redis_key = f"login:token:{user_id}"
|
||||
redis_key = f"client:login:token:{user_id}"
|
||||
raw = await redis_client.get(redis_key)
|
||||
if not raw:
|
||||
return
|
||||
@@ -90,30 +90,11 @@ class JwtAuthMiddleware(BaseHTTPMiddleware):
|
||||
info = json.loads(raw) if isinstance(raw, str) else raw
|
||||
devices = info.get("loginDevices", [])
|
||||
|
||||
# 过滤过期设备
|
||||
now = datetime.now(timezone.utc)
|
||||
valid_devices = []
|
||||
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:
|
||||
# 校验当前设备是否在列表中
|
||||
device_uuids = {d["uuId"] for d in devices}
|
||||
if uu_id not in device_uuids:
|
||||
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))
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user