request_payload.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. """统一解析接口请求载荷(明文 / 密文信封)。"""
  2. from __future__ import annotations
  3. import logging
  4. from typing import Any, Union
  5. from app.core import api_crypto
  6. from app.core.config import settings
  7. def resolve_request_payload(
  8. request_body: dict,
  9. current_user: dict,
  10. *,
  11. source: str = "unknown",
  12. ) -> Union[dict, list]:
  13. """兼容明文与密文信封,返回业务层 payload(多为 dict;批量数组接口解密后为 list)。"""
  14. logger = logging.getLogger("sqxp")
  15. payload = request_body if isinstance(request_body, dict) else {}
  16. if int(payload.get("enc", 0) or 0) == 1 and isinstance(payload.get("edata"), str):
  17. logger.warning(
  18. "%s received encrypted envelope in route handler; middleware may be bypassed",
  19. source,
  20. )
  21. try:
  22. user_id_for_crypto = str(current_user.get("user_id") or "")
  23. ts = int(payload.get("ts"))
  24. nonce = str(payload.get("nonce") or "")
  25. if user_id_for_crypto and nonce and settings.API_ENCRYPT_FIXED_SECRET:
  26. key = api_crypto.derive_key(
  27. fixed_secret=settings.API_ENCRYPT_FIXED_SECRET,
  28. user_id=user_id_for_crypto,
  29. ts=ts,
  30. nonce=nonce,
  31. )
  32. plain = api_crypto.decrypt_json(str(payload.get("edata")), key)
  33. payload = plain if isinstance(plain, dict) else {}
  34. logger.warning(
  35. "%s decrypted payload via route fallback; please verify ApiCryptoMiddleware",
  36. source,
  37. )
  38. except Exception as exc:
  39. logger.warning("%s resolve_request_payload decrypt failed: err=%s", source, exc)
  40. return {}
  41. if isinstance(payload, dict):
  42. inner = payload.get("data")
  43. if isinstance(inner, (dict, list)):
  44. return inner
  45. return payload if isinstance(payload, dict) else {}