协议字符串Schema
同意字符串将用户同意状态存储为二进制数据,编码为base64. 将用户同意状态编码为二进制字符串,或从已存在的字符串中解码,都需要一个编码器/解码器库. Schema以人可读的方式定义同意字符串格式. 这样可以定义出新的格式,或者对现有格式进行更新,而不修改编码器/解码器库.
图表格式
计划的结构如下:
consent_string_typespecification_versionteststypesfields或者说segments
类型
编码员和解码员需要知道他们合作的数据类型. 计划定义有特定类型的字段, 很像编程中的变量。 下列类型必须得到编码器/解码器库的支持:
| {\fn方正粗倩简体\fs12\an8\1cHFFFF00\b0} | 类型编号 | 说明 |
|---|---|---|
| 1个 | u1 | 1 比特大小( 0 或 1) 无符号整数 |
| 2个 | u2 | 未签名的2比特大小的整数 |
| 3个 | u3 | 3 比特大小的无符号整数 |
| 页:1 | u4 | 4 比特大小的无符号整数 |
| 页:1 | u6 | 6 比特大小的无符号整数 |
| 6个 | u12 | 12 比特大小的无符号整数 |
| 第7条 | u16 | 16位数大小的无符号整数 |
| 第8条 | u24 | 24位大小的无符号整数 |
| 第9条 | u32 | 32 位大小的无符号整数 |
| 10个 | date | 日期 |
| 第11个 | uuid | 用户名 - Base16 字符串 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 第12条 | fibonacci | 数字 |
| 第13条 | fibonacci_range | Fibonacci 编号的 Fibonacci ID 范围, 以 Fibonacci 编号为起始 id 和编号 id 编号 |
| 页:1 | u16_range | 以 u16 个数字开头的 Ids 范围 |
| 15个 | bit_field | 位数阵列 |
| 16个 | fixed_bit_field | 固定大小比特字段阵列,大小属性必须在方案内指定 |
| 页:1 | bit_field_2_bits | Bit 字段阵列( bool, bul) |
| 第 18 条 | ranges_u16 | Id 范围矩阵 - (起始 id: u16;结束 id: u16) |
| 第 19 条 | ranges_fibonacci | Id 范围矩阵 - (起始 id: fibonacci,编号 ids: fibonacci) |
| 20国 | string | 表示字符串的固定位数 。 该字符的ASCII整数ID被减去了65并被编码为一int(6). |
| 21国 | optimized_range | 第一个数据类型总是布尔(u1),如果它是真实的,下一个是Fibonacci范围,如果是假的 - Bitfield . |
| 22个 | optimized_u16_range | 以 u16 range - (最大 id: u12, range flag: u1, 类型: [u16 range, 固定 bit field(大小: max id)] 优化位域 |
| 第23条 | array_of_optimized_u16_ranges | 优化- u16 排列( 数字 记录: u12, 键: u6, 类型: u2, ids: 优化- u16 排列) |
| 24个 | n_array_of_ranges_x_y | 通用类型QQ,Y>(数字 记录:u12,密钥:u,类型:u,IDs:优化 范围) |
| 第25条 | optimized_array_of_u16_ranges | (max id:u16,是:u1,类型:[(数字 of indies:u12,是:a range:u1,类型:[起 id:u16,端 id:u16],起 id:u16]),固定 bit field(大小:最大 id)] |
| 第 26 条 | array_of_u16_ranges | (编号: of records:u12,密钥:u6,类型:u2,号码:u12,是 a range:u1,类型:[(从 id:u16起,端-id:u16起,起-id:u16起) |
| 27个 | segment_type | 3bits 分区类型代码 |
| 第28条 | enabled_disabled_ids | 启用和禁用以变体属性所列出的某些类型编码的 ID |
| 29个 | array_of_attributed_u16_ranges | 用于出版商限制编码的指定范围的数组 |
| 30个 | version | 以 6bits 编号编码的同意字符串版本 |
外地
计划的主要组成部分是 field编辑 field 是一个编程语言中的变量的模拟,每个归档必须有一个类型.
有一个实地定义的例子:
{
"type": "version",
"description": "The Didomi Consent String version 6bits number",
"key": "dcs_version",
"value": 2
}
在这里,我们正在定义的领域与 type "版本"和 key 等于“ dcs version” 。 编码器将使用
key 属性访问用户状态对象中提供的字段值。 我们还可以定义领域 value
属性指示编码器不从用户状态对象读取值,而是从计划读取值.
另一个例子是 field 属性是 optional。每个字段都可以是可选的,这将指示
编码器,在字段值之前将1比特旗放入编码字符串中.
如果旗帜是 1,该值是存在的并解码的。 如果是这样 0,在解码时,该值缺失并跳出.
有可选字段定义的例子
{
"type": "date",
"key": "sync",
"optional": true
}
有些字段可以使用不同的编码算法进行编码来进行优化. 说明什么
算法(类型)可以通过编码器用于我们使用的值编码器 variants 字段属性 :
{
"type": "enabled_disabled_ids",
"description": "User Status for purposes opt-out",
"key": "purposes_li",
"variants": [
"bit_field_2_bits",
"ranges_u16",
"ranges_fibonacci"
]
}
这个例子说明了如何使用三种方法来编码用户状态:
bit_field_2_bits, (中文(简体) ), ranges_u16,以及 ranges_fibonacci。 。 。 .
编码器选择产生最短结果的方法并包含
在编码值之前选择方法的代码,允许解码器
以正确解码字符串.
有些类型需要有大小信息才能正确编码/解码.
{
"type": "string",
"description": "Two-letter ISO 639-1 language code in which the CMP UI was presented",
"key": "consent_language",
"size": 12
}
我们在这里定义了一个12位字符串类型字段.
所有字段属性都有摘要:
| {\fn方正粗倩简体\fs12\an8\1cHFFFF00\b0} | 字段属性 | 强制 | 说明 |
|---|---|---|---|
| 1个 | type | Y | 字段类型 |
| 2个 | key | Y | 从模型中提取值的密钥 |
| 3个 | description | Y | 字段说明 |
| 页:1 | size | 无 | 类型大小位 |
| 页:1 | optional | 无 | true 如果值可能缺失 |
| 6个 | value | 无 | 字段常数值 |
| 第7条 | variants | 无 | 类型编码方法变体 |
同意字符串类型
同意字符串计划支持以下类型:
| {\fn方正粗倩简体\fs12\an8\1cHFFFF00\b0} | 字符串类型 | 说明 |
|---|---|---|
| 1个 | didomi_consent_string | Didomi 同意字符串 |
| 2个 | iab_tcf_string | IAB TCF 协议字符串 |
| 3个 | gpp_string | GPP 字符串 |
规格版本
对于每个字符串类型,可以定义几个规格版本,例如:,
给迪多米同意弦 specification_version 1和2,其中第1版
对编码器有一些限制.
测试
同意字符串计划定义了编码器和解码器的测试 tests 阵列。 编码器/解码器库应
运行这些测试,以确保库根据计划产生预期结果.
类型
这个 types 数组定义了由同意字符串计划支持的子集类型(类型) (中文(简体) ). 每个 type
从 types 必须至少出现在字段定义中,来自字段定义的所有类型都应该是
列入清单 types 阵列.
领域和部分
同意字符串计划可以 fields 顶级数组或
segments 阵列。 这个 fields 阵列包含字段定义( r)外地和 segments 能够
用于定义分块字符串结构,其中每个分块编码
单独连接,然后使用 . 字符键.
例如:
{
"tests": {
"encoded": "CQH-gkAQH-gkAAHABBENBOFgAPAAAELAAAAAF5wAQF5gXnABAXmAAAAA.YAAAAAAAAAAA"
}
}
这里有一个 IAB TCF 字符串作为 encoded 值有两个部分:核心部分和出版部分.
在被定义为下列对象的图示中:
{
"name": "Disclosed Vendors",
"key": "disclosed_vendors",
"optional": true,
"fields": [
{
"type": "segment_type",
"description": "DisclosedVendors segment is 1 which is 001 in binary.",
"key": "disclosed_vendors_segment_type",
"value": 1
},
{
"type": "optimized_array_of_u16_ranges",
"description": "Vendors Disclosure",
"key": "disclosed_vendors"
}
]
}
每个 segment 已经 name, (中文(简体) ), key, (中文(简体) ), optional 财务报告和审定财务报表 fields 属性,除 optional 强制的.
Schema 验证
同意字符串计划库提供 validator 函数,通过3个步骤验证计划:
- 使用
zod图书馆 - 验证计划类型
- 验证密钥
结构验证
我们用 zod 以定义同意字符串结构以及控制类型。 比如说,有 field 使用定义
zod数字 :
import { z } from 'zod';
export const availableTypesSchema = z.nativeEnum(SchemaTypes);
export const typesSchema = uniqueNotEmptyArray(availableTypesSchema);
export const consentStringTypeSchema = z.enum([
'didomi_consent_string',
'iab_tcf_string',
'gpp_string',
]);
export const variantsTypes = z.enum([SchemaTypes.bit_field_2_bits, SchemaTypes.ranges_fibonacci, SchemaTypes.ranges_u16]);
export const variantsSchema = uniqueNotEmptyArray(variantsTypes);
export const fieldSchema = z.object({
type: availableTypesSchema,
description: z.string(),
key: z.string(),
optional: z.boolean().optional(),
size: z.number().or(z.string()).optional(),
value: z.number().optional(),
variants: variantsSchema.optional()
});
这个计划确保了 type 属性只包含允许的类型 variants 属性包含三个允许的类型.
类型验证
虽然 zod 验证类型,计划还必须确保所有类型 types 阵列用于字段定义,
并且所有字段类型都列在 types 阵列。 此镜像编程语言, 其中类型被定义
使用前和未使用的定义可能触发警告或错误.
图书馆的 typeValidator 之后执行此约束 zod 审定.
密钥验证
最后的验证步骤需要确保域定义中的所有密钥都独一无二. 图书馆的 keyValidator 运行后
页:1 typeValidator 以强制执行这一限制.