签入版本
This commit is contained in:
+22
-2
@@ -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发起的请求将跳过权限验证
|
||||
|
||||
Reference in New Issue
Block a user