Spaces:
Running
Running
Upload 安全认证.py
Browse files
安全认证.py
CHANGED
|
@@ -340,11 +340,16 @@ async def optional_auth(authorization: str = Header(None, alias="Authorization")
|
|
| 340 |
|
| 341 |
def verify_token_with_fallback(token: str) -> Tuple[bool, Optional[str], str]:
|
| 342 |
"""
|
| 343 |
-
兼容验证:同时支持 JWT 和旧版
|
| 344 |
|
| 345 |
验证顺序:
|
| 346 |
-
1.
|
| 347 |
2. 旧版 mock_token 格式兼容
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 348 |
|
| 349 |
参数:
|
| 350 |
token: Token 字符串(JWT 或 mock_token_xxx)
|
|
@@ -352,7 +357,7 @@ def verify_token_with_fallback(token: str) -> Tuple[bool, Optional[str], str]:
|
|
| 352 |
返回:
|
| 353 |
(is_valid, account, error_message)
|
| 354 |
"""
|
| 355 |
-
# 1. 先尝试 JWT 验证
|
| 356 |
is_valid, payload, error_msg = verify_token(token)
|
| 357 |
if is_valid:
|
| 358 |
return True, payload.get("sub"), ""
|
|
@@ -360,14 +365,26 @@ def verify_token_with_fallback(token: str) -> Tuple[bool, Optional[str], str]:
|
|
| 360 |
# 2. 降级:检查是否为旧版 mock_token
|
| 361 |
if token.startswith("mock_token_"):
|
| 362 |
account = token.replace("mock_token_", "")
|
| 363 |
-
print(f"⚠️ 兼容
|
| 364 |
return True, account, ""
|
| 365 |
|
| 366 |
-
# 3. JWT 签名无效
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 371 |
|
| 372 |
|
| 373 |
# ==========================================
|
|
|
|
| 340 |
|
| 341 |
def verify_token_with_fallback(token: str) -> Tuple[bool, Optional[str], str]:
|
| 342 |
"""
|
| 343 |
+
兼容验证:同时支持 JWT 和旧版 Token(过渡期)
|
| 344 |
|
| 345 |
验证顺序:
|
| 346 |
+
1. 标准 JWT 验证(当前密钥)
|
| 347 |
2. 旧版 mock_token 格式兼容
|
| 348 |
+
3. 签名无效的 JWT:降级提取 payload 中的 sub 字段(过渡期兼容)
|
| 349 |
+
|
| 350 |
+
⚠️ 过渡期策略:
|
| 351 |
+
- 当前阶段:宽容模式,允许签名无效的旧 JWT 通过(提取 sub 信任)
|
| 352 |
+
- 下一版本:移除第3步,强制要求有效签名
|
| 353 |
|
| 354 |
参数:
|
| 355 |
token: Token 字符串(JWT 或 mock_token_xxx)
|
|
|
|
| 357 |
返回:
|
| 358 |
(is_valid, account, error_message)
|
| 359 |
"""
|
| 360 |
+
# 1. 先尝试标准 JWT 验证
|
| 361 |
is_valid, payload, error_msg = verify_token(token)
|
| 362 |
if is_valid:
|
| 363 |
return True, payload.get("sub"), ""
|
|
|
|
| 365 |
# 2. 降级:检查是否为旧版 mock_token
|
| 366 |
if token.startswith("mock_token_"):
|
| 367 |
account = token.replace("mock_token_", "")
|
| 368 |
+
print(f"⚠️ [过渡兼容] 旧版 mock_token 用户: {account}")
|
| 369 |
return True, account, ""
|
| 370 |
|
| 371 |
+
# 3. 过渡期兼容:JWT 签名无效时,尝试直接解析 payload 提取账号
|
| 372 |
+
# 这允许旧版(密钥不同时签发的)JWT 仍能使用
|
| 373 |
+
# ⚠️ 下一版本将移除此降级逻辑,届时用户必须重新登录
|
| 374 |
+
if error_msg in ("Token 签名无效", "Token 已过期,请重新登录"):
|
| 375 |
+
try:
|
| 376 |
+
parts = token.split(".")
|
| 377 |
+
if len(parts) == 3:
|
| 378 |
+
payload_json = _base64url_decode(parts[1]).decode("utf-8")
|
| 379 |
+
payload_data = json.loads(payload_json)
|
| 380 |
+
account = payload_data.get("sub")
|
| 381 |
+
if account:
|
| 382 |
+
print(f"⚠️ [过渡兼容] 旧版 JWT 降级信任,用户: {account}(签名未验证,下版本将失效)")
|
| 383 |
+
return True, account, ""
|
| 384 |
+
except Exception:
|
| 385 |
+
pass
|
| 386 |
+
|
| 387 |
+
return False, None, error_msg or "Token 验证失败"
|
| 388 |
|
| 389 |
|
| 390 |
# ==========================================
|