feat(audit): MOM 回调归因到实际操作人,不再显示「未认证」

外部回调走 X-API-Key 鉴权、没有 JWT,JWT 依赖不执行,审计中间件读到的
request.state.audit_user 永远是空 —— 操作审计里就出现一堆没有归属的
「外部系统对接」记录,看不出是谁扫的码。

MOM 载荷里本来就带着实际操作人(operator,即 MOM 侧扫码的那位),写进
request.state 即可让审计归因到人;顺手解析中文姓名(查不到也不影响审计,
前端会回退显示账号)。

⚠️ 调用位置必须在 X-API-Key 校验【之后】:密钥不对说明载荷本身就不可信,
   此时把 operator 写进审计等于允许伪造人。放在部门校验之后同样有意为之 ——
   被拦下的外来消息不该留下任何归属痕迹。

取不到操作人时写 "MOM系统" 而非留空:「MOM系统」至少说明这是一次机器回调,
比继续显示「未认证」(读起来像"一个匿名的人")更准确。

本函数与 IRIS 实例(~/track)代码体逐行一致,只差 docstring —— 两侧审计口径
必须一样,否则排查时日志对不上。约定已记入 AGENTS.md。

实测:MOM 回调后审计记录显示实际操作人姓名;无 operator 时显示「MOM系统」。
This commit is contained in:
2026-09-22 13:45:00 +08:00
parent 754c25b477
commit 9778b8e4b2
2 changed files with 54 additions and 1 deletions

View File

@ -112,6 +112,19 @@
排查口径:**有 `reason` = 被部门校验拦下;无 `reason` = 通过了校验、只是产品没匹配上。**
- **MOM 回执的审计归因**`endpoints/webhooks.py`2026-09 新增)
外部回调走 X-API-Key、没有 JWT审计中间件读到的 `request.state.audit_user`
永远是空 —— 操作审计里会出现一堆没有归属的「外部系统对接」记录,看不出是谁
扫的码。现在用载荷里的 `operator`MOM 侧实际扫码的那位)写进 `request.state`
归因到人;取不到操作人时写 `"MOM系统"`,而不是继续显示「未认证」。
⚠️ 调用位置必须在 X-API-Key 校验**之后** —— 密钥不对说明载荷本身就不可信,
此时写审计等于允许伪造人。放在两处部门校验**之后**同样有意为之:被拦下的
外来消息不该留下任何归属痕迹。
该函数与 IRIS 实例(`~/track`)代码体逐行一致,只差 docstring —— 改动请两边
同步,否则两个实例的审计口径会对不上。
## 本地起环境(关键,踩过的坑都在这)
1. **本机没有 Postgres 时需要先装**(容器内 `sudo` 可用):