签入版本

This commit is contained in:
2026-09-12 18:57:19 +08:00
parent d45b61d808
commit 2857e0f2da
295 changed files with 20713 additions and 13125 deletions
+22 -2
View File
@@ -20,9 +20,22 @@ logger = logging.getLogger(__name__)
# 从环境变量读取,未配置则拒绝启动,防止使用已知弱密钥
JWT_SALT = os.getenv('JWT_SALT', '')
# JWT令牌过期时间(分钟)
# 滑动会话空闲超时(分钟):用户在此时间内无任何请求,会话过期需重新登录。
# 每收到一次有效请求,Redis 会话 TTL 被重置为该值(sliding session)。
JWT_EXPIRE_MINUTES = int(os.getenv('JWT_EXPIRE_MINUTES', 20))
# JWT 令牌绝对有效期(分钟):即使一直活跃,令牌最长有效时间,到期强制重新登录。
# 防止会话无限续期,需大于 JWT_EXPIRE_MINUTES(默认 1440 = 24小时)。
JWT_ABSOLUTE_TIMEOUT_MINUTES = int(os.getenv('JWT_ABSOLUTE_TIMEOUT_MINUTES', 1440))
# 启动校验:绝对有效期须 ≥ 空闲超时,否则滑动会话模型失效(一直活跃也会被绝对期限打断)
if JWT_ABSOLUTE_TIMEOUT_MINUTES < JWT_EXPIRE_MINUTES:
raise RuntimeError(
f"JWT_ABSOLUTE_TIMEOUT_MINUTES({JWT_ABSOLUTE_TIMEOUT_MINUTES}) "
f"不能小于 JWT_EXPIRE_MINUTES({JWT_EXPIRE_MINUTES}),"
"绝对有效期须大于等于滑动会话空闲超时"
)
# 登录失败次数上限(同一IP+用户名连续失败超过此次数后锁定)
LOGIN_FAIL_MAX = int(os.getenv('LOGIN_FAIL_MAX', 5))
@@ -40,12 +53,19 @@ PERMISSION_ENABLED = os.getenv('PERMISSION_ENABLED', 'True') == 'True'
# 调用方需在请求头中携带 X-Internal-API-Key 或 X-Scheduler-Key
INTERNAL_API_KEY = os.getenv('INTERNAL_API_KEY', '')
# 启动时校验:未配置则拒绝启动,防止定时任务权限验证失效
# 启动时校验:该密钥是权限全绕过的凭据,必须为强随机值,不符合则 fail-closed 拒绝启动。
# 规则化校验(长度 ≥32)而非黑名单枚举,任何弱值/新弱值都会被拦截。
if not INTERNAL_API_KEY:
raise RuntimeError(
"INTERNAL_API_KEY 未配置!请在 .env 中设置内部调用密钥。\n"
"生成方式:python -c \"import secrets; print(secrets.token_urlsafe(32))\""
)
if len(INTERNAL_API_KEY) < 32:
raise RuntimeError(
f"INTERNAL_API_KEY 长度不足 32 位(当前 {len(INTERNAL_API_KEY)} 位),"
"拒绝启动(fail-closed)。请更换为强随机密钥:\n"
"python -c \"import secrets; print(secrets.token_urlsafe(32))\""
)
# 内部调用白名单IP(逗号分隔,支持通配符如 127.0.0.*)
# 在此列表中的IP发起的请求将跳过权限验证