refactor(webhook): 抽离敏感请求头配置到公共模块

将硬编码的敏感请求头集合替换为公共crypto模块的常量,统一维护敏感头配置,避免重复定义
This commit is contained in:
Kris 2026-06-30 16:15:09 +08:00
parent 1bf28f4ed6
commit 0993a721b6

View File

@ -47,23 +47,12 @@ from yuxi.external_systems.use_cases.dto.webhook import (
VerifySignatureInput, VerifySignatureInput,
) )
from yuxi.storage.postgres.models_business import User from yuxi.storage.postgres.models_business import User
from yuxi.utils.crypto import SENSITIVE_HTTP_HEADERS
from server.utils.auth_middleware import get_admin_user, get_db, get_required_user from server.utils.auth_middleware import get_admin_user, get_db, get_required_user
webhook_router = APIRouter(prefix="/webhooks", tags=["external-systems-webhook"]) webhook_router = APIRouter(prefix="/webhooks", tags=["external-systems-webhook"])
# 敏感请求头白名单:``POST /events`` 透传 headers 到 WebhookEvent 持久化前必须剔除,
# 对齐 ``ExternalWebhookEvent`` ORM 注释"payload/headers 由调用方在写入前完成脱敏"。
_SENSITIVE_HEADERS = frozenset(
{
"authorization",
"cookie",
"set-cookie",
"x-api-key",
"x-auth-token",
}
)
def _extract_client_ip(request: Request) -> str | None: def _extract_client_ip(request: Request) -> str | None:
"""提取客户端真实 IP优先解析 ``x-forwarded-for``(与访问日志中间件一致)。""" """提取客户端真实 IP优先解析 ``x-forwarded-for``(与访问日志中间件一致)。"""
@ -76,8 +65,11 @@ def _extract_client_ip(request: Request) -> str | None:
def _sanitize_headers(headers: Any) -> dict[str, Any]: def _sanitize_headers(headers: Any) -> dict[str, Any]:
"""过滤敏感请求头,避免 ``authorization`` / ``cookie`` 等泄露到持久化层。""" """过滤敏感请求头,避免 ``authorization`` / ``cookie`` 等泄露到持久化层。
return {key: value for key, value in headers.items() if key.lower() not in _SENSITIVE_HEADERS}
敏感字段集合统一引用 ``yuxi.utils.crypto.SENSITIVE_HTTP_HEADERS``单一事实源
"""
return {key: value for key, value in headers.items() if key.lower() not in SENSITIVE_HTTP_HEADERS}
# ---------------- Request Schemas ---------------- # ---------------- Request Schemas ----------------