ZHIWEI666 commited on
Commit
9d90fe0
·
verified ·
1 Parent(s): 70e4bba

Upload 安全认证.py

Browse files
Files changed (1) hide show
  1. 安全认证.py +26 -9
安全认证.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 和旧版 mock_token
344
 
345
  验证顺序:
346
- 1. 当前 JWT_SECRET 验证
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"⚠️ 兼容模式:检测到旧版 mock_token,用户 {account}")
364
  return True, account, ""
365
 
366
- # 3. JWT 签名无效/过期时,提示重新登录
367
- if error_msg == "Token 签名无效":
368
- return False, None, "Token 已失效,请重新登录"
369
-
370
- return False, None, error_msg
 
 
 
 
 
 
 
 
 
 
 
 
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
  # ==========================================