Appearance
AnchorCAF 授权页个性化参数
状态:前端已上线。发布日期:2026-10-19 19:05(Asia/Shanghai)。对应 CAFServer PR #1,合并提交
449e0b7718c0fd43a55635945d0001170cc71c86。本文描述本次已发布授权确认页的外观参数与界面行为,不等同于完整 OAuth 协议文档。应用注册及授权码后续处理沿用接入方已确认的配置。
1. 使用方式与作用边界
将以下可选参数添加到现有 AnchorCAF 授权 URL 的 query 中,保留原有 client_id、redirect_uri、state 及其他业务参数。使用 URL / URLSearchParams 编码,避免直接拼接 #、&、中文或回调地址。
本次已核验的公开授权入口为 https://auth.apoints.cn/web/oauth/authorize 和 https://auth.apoints.email/web/oauth/authorize。未登录时仍通过原登录页完成登录,并保留授权请求。
- 外观参数仅影响渲染,不改变登录身份、回调目标或申请权限。
- 应用名称与权限来自服务端 client-info,而非
icon、标语或其他展示参数。 - 当前账号、邮箱与头像来自已登录账号信息,不接受通过授权 URL 指定。
- 子应用仅传纯文本、枚举、受限整数及受限图片 URL,不传 CSS、HTML 或样式对象。
- AnchorCAF 左上角公司标识固定;
icon指的是授权卡片内的子应用图标。
2. 参数表
所有字段均为 URL query 字符串。建议每个参数只传一次;字号与 debug 的重复值处理见下文。
| 参数 | 合法值 | 未提供或无效时 | 用途 |
|---|---|---|---|
theme | purple、blue、emerald 或六位 Hex,如 #6E44FF | 使用有效的 theme_color;仍无有效值时用默认紫色 | 主色,派生按钮、背景光晕和标语强调色 |
color_mode | light、dark、system | 未提供时可读取 theme 中的同名明暗值,否则使用宿主主题;传入无效的非空值时使用宿主主题 | 初始明暗模式;用户仍可在页面切换 |
icon | 符合第 5 节约束的 HTTPS URL 或内置图标路径 | 使用通用应用图标 | 子应用图标 |
slogan_line_1 | 第一行纯文本,可含成对的 **高亮词** | 空行 | 宽屏左侧标语第一行 |
slogan_line_2 | 第二行纯文本,可含成对的 **高亮词** | 空行 | 宽屏左侧标语第二行 |
slogan_template | split、centered、minimal | split | 标语预设版式 |
slogan_font_size_1 | 十进制整数 12–64 | 第一行使用模板默认字号 | 第一行字号上限,单位 CSS px |
slogan_font_size_2 | 十进制整数 12–64 | 第二行使用模板默认字号 | 第二行字号上限,单位 CSS px |
debug | 仅一个精确的 true 启用 | 关闭 | 显示可折叠的权限技术详情 |
两行独立字号
text
slogan_font_size_1=40
slogan_font_size_2=40- 两行分别校验,互不覆盖。例如第一行
14、第二行42也有效。 - 未传或无效时,仅该行回退到模板默认字号,不回退到另一行字号。
- 值必须是两位数字;
14px、14.5、014、14、CSS 表达式和范围外数字无效。 - 同名字号参数重复传入时,该行参数无效,即使两个值相同。
- 字号是上限,容器空间不足时允许缩小;不承诺任何视口都保持请求字号。
- 第一行为空时,第二行仍使用
slogan_font_size_2。
其他已存在的输入
推荐新接入使用上表字段。当前实现还会读取:
| 参数 | 当前行为 |
|---|---|
theme_color | 与 theme 相同的主色格式;有效的 theme 主色优先 |
theme=light|dark|system | 明暗模式输入;推荐使用独立的 color_mode,主色另传 |
message | 无任一结构化标语字段时使用;第一行换行前文字作为第一行,其余换行合并为第二行,执行相同的高亮与长度限制 |
message_style | 忽略,不解析 CSS 或样式对象 |
仅“存在”任意一个 slogan_line_1 / slogan_line_2 字段,即选择结构化标语;即使值为空,也不再使用 message 补齐。
3. 版式与文字规则
模板
| 模板 | 对齐及强调方式 |
|---|---|
split | 左对齐;第二行无显式高亮标记且两行均存在时,自动强调第二行 |
centered | 居中对齐;只强调显式标记部分 |
minimal | 左对齐、较轻字重;只强调显式标记部分 |
当前没有 eyebrow、couplet 或 subtitle 模板。两行独立字号可在既有模板中形成不同文字层级,但不会自动改变字重、强制英文大写或添加胶囊装饰。
总长度限制
两行总计最多 20 个汉字等价长度:
- ASCII 字母、数字、空格及半角标点各计
0.5。 - 其他 Unicode 码点各计
1,包括中文、全角标点和 emoji 码点;复杂组合 emoji 可能包含多个码点。 - 成对
**高亮标记不计长度,标记内文字仍计长度。 - 两行之间用于合并文本的一个空格计
0.5,即使窄屏最终隐藏标语,也使用同一限制。 - 超限按原始顺序截取连续前缀,不拆开 UTF-16 代理对;不保证复杂组合字形不被拆分。
- 清理控制字符、双向文本控制字符,并将连续空白归一化为一个空格、去掉首尾空白后再处理。
例如 Save your attention. 为 20 个 ASCII 字符,加行间空格和 敛时自处,合计 10 + 0.5 + 4 = 14.5,无需截断。
高亮
text
slogan_line_1=**Save your attention.**
slogan_line_2=敛时自处仅识别成对 **文字**,由认证页渲染主题渐变强调。这不是完整 Markdown;HTML 作为文本显示,不执行标签或脚本。强调样式由 AnchorCAF 统一提供。
响应式
- CSS 视口宽度 至少 960px 且存在标语时,展示左文右卡。
- 小于 960px 隐藏整个自定义标语,不将其搬入授权卡片。
- 没有标语时使用居中的单卡布局。
- 合理内容在常见桌面视口中可单屏展示;极小视口、长内容、展开大量权限或浏览器放大时保留正常滚动,不裁切操作按钮。
4. 主题色
子应用只传一个预设名或六位 Hex:
text
theme=purple
color_mode=light或通过 URLSearchParams 设置:
js
url.searchParams.set('theme', '#6E44FF');不要直接把未编码的 #6E44FF 拼入查询串,否则 # 后会被解析为 fragment。
- 由 HSL 算法派生主按钮实色、标语高亮及静态柔和光晕。
- 主按钮使用白字,必要时调整背景亮度,以保证正常和悬停状态至少
4.5:1对比度;因此按钮颜色未必等于输入色值。 - 颜色算法不执行调用方代码。
- 卡片毛玻璃由认证页统一设置为
blur(16px) saturate(165%),并为减少透明度偏好、不支持滤镜及强制颜色模式保留实底回退。这不是开放参数。
5. 子应用图标
icon 接受以下两类值:
- HTTPS 图片 URL:最长 2048 字符,不带用户名或密码,仅默认端口或
443;拒绝 IP、单标签主机、.localhost、.local、.internal及 IPv6 主机。 - 认证页已部署的内置资源:
/web/consent/<文件名>.<扩展名>,仅允许代码规定的文件名格式及png、jpg、jpeg、webp、gif、svg。
远程图标通过浏览器图片请求加载,使用匿名 CORS 和 no-referrer,不携带 AnchorCAF Bearer Token,也没有服务端图片下载代理。图片服务应允许匿名读取并返回适当的 CORS 响应头。
参数无效、资源不存在、格式解码失败或 CORS 失败时显示通用应用图标。预览专用图标不代表生产已经部署;真实集成推荐使用应用维护的 HTTPS 图标。
6. 调试参数
只有查询串中 恰好一个 debug=true 才显示权限技术详情。
text
debug=true 显示
debug=false 隐藏
debug=1 隐藏
debug=True 隐藏
debug=true&debug=true 隐藏它只控制详情的可见性,不授予权限,不是管理员身份或鉴权开关,也不应作为隐藏敏感数据的安全边界。
权限最多 3 项时不显示孤立的数量徽标;超过 3 项时默认展示前 3 项,数量以文字紧跟标题,其余可展开。折叠不会缩减实际授权范围。
7. Anchor Cat 示例
当前预览恢复为两行 40px / 40px,不新增模板:
json
{
"theme": "purple",
"color_mode": "light",
"slogan_template": "minimal",
"slogan_font_size_1": "40",
"slogan_font_size_2": "40",
"slogan_line_1": "**Save your attention.**",
"slogan_line_2": "敛时自处"
}icon 可另行传入符合规则的应用图片地址。应用真实名称仍由服务端返回,不能通过示例中的展示字段伪装。
完整 URL 构造方式见 调用示例。示例接收已有授权 URL,不猜测生产域名或授权路径。
8. 账号区域与授权流程边界
这些行为由认证中心固定实现,不是子应用外观参数:
- 显示账号昵称与完整的有效邮箱;无自定义头像时,使用白底圆形加主题色粗体首字符,图片加载失败也回退到首字符。
- 切换账号保留本次授权参数并返回认证中心登录流程。
- 权限标题在应用名与正文之间保留一个半角空格,例如
Anchor Cat 将获取以下权限:。 - 权限项间距收紧,权限列表与下方撤销授权说明之间保留更大分组留白。
- 主操作按钮不带装饰箭头,仍保留加载状态与防重复提交保护。
- 成功后使用真实返回的授权码;提供回调时保留已有查询参数并附加
code和非空state。接入应用应自行生成、保存并核对state,防止请求混淆。 - 未配置回调时,成功页展示授权码并提供复制操作;提交前不显示额外授权码提醒。
- 取消当前为返回浏览器历史或认证中心控制台,不约定返回 OAuth
error=access_denied;接入方不要假设存在该回调。 - POST 超时、网络中断或响应异常导致结果不确定时,不自动重试或再次发起同一授权。
本文不定义授权码交换接口、有效期、PKCE 或服务器端回调白名单策略;这些需按实际后端协议另行核验和记录。
9. 状态与验收
2026-10-19 发布前已完成:
- 合并现有生产前端基线后,完整正式工程的 72 项单元测试与 TypeScript / Vite 构建通过。
- Anchor Cat 浅色页面在 1280×720 验证为两行 40px / 40px,无垂直溢出。
- 标题半角空格、权限项间距和分组留白已经核验。
生产发布结果
- 2026-10-19 19:05(Asia/Shanghai)完成静态发布,对应源码提交
f433907、GitHub 合并提交449e0b7。 - 先同步生产已有的短信登录、找回密码、账号安全与 OAuth next 导航,再叠加授权页改版;不回退原有前端功能。
- 两个域名的登录、注册、找回密码、短信登录和旧授权入口均返回新构建入口;新 JS、CSS、公司图标下载后与发布包逐字节一致。
- 服务器直接从磁盘读取静态目录;保留旧哈希资源、原子替换入口,CAF 进程 PID 与后端程序未改变,数据库未修改。
- 首次验收的未压缩 JS 下载触发 20 秒超时并自动回滚;旧、新 JS 使用浏览器式 gzip 下载均通过后,第二次发布通过。两次切换期间共 80 次本地 HTTP 可用性采样均为 200;这不是无间断的全链路监控,也不代表所有网络用户的延迟。
- 正式完整构建在隔离接口中走通“不带新外观参数的旧链接 → 原密码登录 → 授权 → 回调”,验证
client_id、permissions、redirect_uri、code、state和原查询参数均保留;生产浏览器核验了旧链接进入原密码/短信登录页。 - 未代用户进行真实账号登录、短信发送或真实授权提交。 这些端到端业务操作仍需由实际使用方验收。
此记录不是所有设备、模式或生产环境的全面验收。完整后端 OAuth 协议和真实业务验收范围仍按实际接入情况维护。
