关于 consent-pref-center
面向设计同意偏好中心的团队,介绍数据结构、API、界面行为、审计记录及 IAB TCF v2.2 要求。
主要功能
- 01同意数据模型与 API 设计
- 02TCF v2.2 集成要求
- 03按处理目的设置偏好
- 04同意历史与回执下载
- 05版本管理与传播审计
适用场景
- 01设计同意记录和接口
- 02规划兼容 TCF v2.2 的偏好中心
- 03构建撤回同意流程
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mukul975/ privacy-data-protection-skills --skill consent-pref-center安装后在 Claude Code 中输入/consent-pref-center确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/template.mdreferences/standards.mdworkflows.mdscripts/process.py详细介绍
构建同意偏好中心
概述
同意偏好中心是一个集中式界面,数据主体可通过它管理针对所有处理目的的同意选择。根据 GDPR 第 7(3) 条,撤回同意必须与给予同意同样容易,因此,精心设计的偏好中心对于合规至关重要。IAB Europe Transparency and Consent Framework (TCF) v2.2 为与此架构集成的广告相关同意提供了标准化方法。
架构组件
1. 数据模型
同意偏好中心需要四个核心数据实体:
同意目的注册表 存储所有以同意为合法依据的处理目的。
| 字段 | 类型 | 描述 |
|---|---|---|
| purpose_id | UUID | 处理目的的唯一标识符 |
| purpose_name | VARCHAR(256) | 易于理解的目的名称 |
| purpose_description | TEXT | 通俗易懂的描述(Flesch-Kincaid 年级为 8 或以下) |
| legal_basis | ENUM | "consent" 或 "explicit_consent" |
| data_categories | JSONB | 已处理个人数据类别的数组 |
| recipients | JSONB | 指定的第三方接收方数组 |
| retention_period | VARCHAR(128) | 此目的的数据保留期限 |
| tcf_purpose_id | INTEGER | 适用时映射的 IAB TCF v2.2 目的 ID (1-11) |
| is_active | BOOLEAN | 此目的当前是否提供 |
| created_at | TIMESTAMP | 目的注册时间 |
| updated_at | TIMESTAMP | 最后修改时间戳 |
同意文本版本 记录向用户展示的同意文本,且记录不可变。
| 字段 | 类型 | 描述 |
|---|---|---|
| version_id | UUID | 唯一版本标识符 |
| purpose_id | UUID | 指向目的注册表的外键 |
| consent_text | TEXT | 向用户展示的确切文本 |
| text_hash | CHAR(64) | consent_text 的 SHA-256 哈希值 |
| effective_from | TIMESTAMP | 此版本生效时间 |
| effective_until | TIMESTAMP | 此版本被替代的时间(若为当前版本则为 NULL) |
| approved_by | VARCHAR(256) | 批准此版本的 DPO 或法律审核人员姓名 |
同意决定 记录数据主体作出的每项同意决定。
| 字段 | 类型 | 描述 |
|---|---|---|
| decision_id | UUID | 唯一决定标识符 |
| subject_id | UUID | 数据主体标识符 |
| purpose_id | UUID | 指向目的注册表的外键 |
| version_id | UUID | 指向所展示同意文本版本的外键 |
| decision | ENUM | "granted" 或 "withdrawn" |
| mechanism | VARCHAR(64) | "checkbox_tick"、"toggle_switch"、"api_call" |
| timestamp | TIMESTAMP | ISO 8601 UTC 时间戳 |
| ip_address | INET | 作出决定时的 IP 地址 |
| user_agent | TEXT | 浏览器 user agent 字符串 |
| source | VARCHAR(64) | "signup_flow"、"preference_center"、"cookie_banner"、"api" |
同意传播日志 跟踪同意变更后向下游系统发送的通知。
| 字段 | 类型 | 描述 |
|---|---|---|
| propagation_id | UUID | 唯一传播事件 ID |
| decision_id | UUID | 触发此事件的同意决定外键 |
| target_system | VARCHAR(256) | 收到通知的下游系统名称 |
| status | ENUM | "pending"、"delivered"、"acknowledged"、"failed" |
| sent_at | TIMESTAMP | 通知发送时间 |
| acknowledged_at | TIMESTAMP | 下游系统确认收到通知的时间 |
2. API 设计
GET /api/v1/consent/preferences/{subject_id} 返回指定数据主体所有目的的当前同意状态。
响应:
{
"subject_id": "usr_7f3a9b2e-41d8-4c76-b5e3-9a8d1c2f4e60",
"preferences": [
{
"purpose_id": "pur_analytics_001",
"purpose_name": "Service Improvement Analytics",
"decision": "granted",
"granted_at": "2026-01-15T10:30:00Z",
"version_id": "ver_a1b2c3d4"
},
{
"purpose_id": "pur_marketing_002",
"purpose_name": "Product Update Emails",
"decision": "withdrawn",
"withdrawn_at": "2026-02-20T14:45:00Z",
"version_id": "ver_e5f6g7h8"
}
],
"last_updated": "2026-02-20T14:45:00Z"
}
PUT /api/v1/consent/preferences/{subject_id} 更新一个或多个目的的同意状态,并触发下游传播。
请求:
{
"decisions": [
{
"purpose_id": "pur_marketing_002",
"decision": "granted",
"mechanism": "toggle_switch"
}
]
}
GET /api/v1/consent/history/{subject_id} 根据第 7(1) 条,返回完整的同意历史记录,以供审计。
GET /api/v1/consent/receipt/{decision_id} 以 Kantara Initiative Consent Receipt 格式返回单条同意回执。
3. TCF v2.2 集成
IAB Transparency and Consent Framework v2.2(于 2023 年 9 月发布)要求:
- TC String 生成:将同意信号编码为 IAB TC String 格式。TC String 是经过 base64url 编码的位字段,用于记录对 TCF 定义的目的(1-11)的同意情况和合法利益声明。
- CMP 注册:向 IAB Europe 注册为 Consent Management Platform。每个注册的 CMP 都会获得一个唯一的 CMP ID,用于生成 TC String。
- 供应商列表集成:使用 IAB Global Vendor List (GVL) 展示供应商级别的同意选项。GVL 发布于 vendorlist.consensu.org,每周更新。
- 目的映射:将 CloudVault SaaS Inc. 的内部目的映射到 TCF v2.2 的目的:
- TCF Purpose 1(在设备上存储和/或访问信息)→ Cookie 同意
- TCF Purpose 3(创建用于个性化广告的用户画像)→ 如适用
- TCF Purpose 7(衡量广告效果)→ 分析同意
- 发布者限制:当 CloudVault SaaS Inc. 的政策要求时,配置发布者级别的限制,将供应商限定为仅使用同意这一法律依据。
4. UI 组件规范
CloudVault SaaS Inc. 的偏好中心界面遵循以下设计原则:
布局:
- 可通过“设置 > 隐私 > 管理同意”访问(从任意页面最多点击 2 次)
- 也可通过直接 URL 访问:app.cloudvault-saas.eu/settings/privacy
- 每个页面的页脚都包含固定的“隐私选项”链接
按目的设置开关:
- 每个目的显示:目的名称、1 句描述、当前状态(开/关切换开关)
- “了解详情”可展开区域包含:完整描述、数据类别、接收方、保留期限
- 切换开关后立即调用 API 并显示确认信息
同意历史记录:
- 每个目的旁都有“查看历史记录”链接,显示:日期、操作(已授予/已撤回)、同意文本版本
- 可下载 JSON 格式的同意回执(Kantara Consent Receipt specification v1.1)
撤回流程:
- 点击一次切换开关即可撤回(与注册时点击一次即可授予同意一致)
- 确认对话框:“确定要撤回对 [目的] 的同意吗?这将停止[具体处理活动]。你可以随时重新启用。”
- 撤回后确认:“已撤回同意。处理将在 24 小时内停止。”
版本历史记录和审计跟踪
每次更改同意文本都会创建一条新版本记录。偏好中心始终显示当前版本,同时保留所有历史版本。通过审计查询可以还原:
- 在特定时间向特定用户显示的文本
- 每个目的的同意授予和撤回时间
- 是否已通知下游系统同意变更
- 每次同意变更的传播状态和时间
主要法规参考
- GDPR 第 7(1) 条 — 证明已取得同意
- GDPR 第 7(3) 条 — 撤回同意的权利及操作难易程度应相同的要求
- GDPR 第 12(1) 条 — 信息应透明、易懂且易于获取
- IAB TCF v2.2 Specification(2023 年 9 月)— TC String 编码、CMP 要求
- Kantara Initiative Consent Receipt Specification v1.1 — 标准同意回执格式
- EDPB Guidelines 05/2020 — Regulation 2016/679 下的同意