模块 3 · 出参脱敏

PLATFORM_RESPONSE_DESENSITIZE:
模拟库原样,真库再遮

环境变量 PLATFORM_RESPONSE_DESENSITIZE 控制平台 API 出参是否打码姓名/手机/证件。 v0.1 默认关——本地 Core 模拟库联调看原值;接真 Core 再开,在 Platform Service 统一出口处理。

开关行为一览

开关模拟库联调生产 / 真 Core
false(默认)L0 字段原样返回—
true—姓名/手机/证件/银行卡打码;customer_id 不脱敏
实现位置: 响应脱敏(app/service/platform/common.py)的 maybe_desensitize_row → prepare_row。REST 与 Agent 适配层都应走这里,不要在路由里手写 mask。
响应脱敏(platform/common.py)
def maybe_desensitize_row(row: dict | None) -> dict | None:
    if row is None or not settings.platform_response_desensitize:
        return row
    for key, masker in (
        ("display_name", d.mask_name),
        ("mobile_phone", d.mask_phone),
        ("id_card_no", d.mask_id_card),
        ...
    ): ...
def prepare_row(row):
    return to_jsonable(maybe_desensitize_row(row) or row)
白话

开关关着 → 数据库行原样返回,方便本地对账。

开关开着 → 按字段名找 mask 函数,逐个打码。

prepare_row 是统一出口:先脱敏,再把 Decimal/日期转成 JSON 能序列化的类型。

指挥 AI 加新字段时,若含 PII,记得在这里登记 masker。

自检:你能否指挥 AI 正确切换?

准备接真 Core,要让出参打码手机号,最省事的做法是?

脱敏开启后,customer_id 会被打码吗?