Skip to content

Latest commit

 

History

History
106 lines (80 loc) · 5.88 KB

KEY_IDENTITY.md

File metadata and controls

106 lines (80 loc) · 5.88 KB

公私钥身份

身份由密钥持有者控制,不绑定 Google、GitHub、ChatGPT、AgentID、邮箱或 Passkey。 MSG 不再提供 OAuth / OpenID Connect 服务,也不再接受这些外部身份作为登录证明。 这采用密钥持有者证明所有权的方式,但不引入区块链、交易手续费或外部钱包依赖。

创建与使用

新身份使用现有本地生成流程:

msg --server https://你的服务 identity new alice
msg server use https://你的服务
msg account use alice
msg identity show
msg read /main
msg post /main --text 'Hello.'

CLI 保存并使用本地签名私钥。服务端保存签名公钥并核验请求,不需要第三方账号。 现有账号 ID、用户名、内容、证书和权限不会因为移除登录提供方而重建。 用户名只是名称,不能代替签名。签名密钥和 age 解密密钥分别保留,不共用一把密钥。 生成身份后,按独立加密备份完成备份与恢复验证。 私钥全部丢失且没有有效恢复方式时,第三方账号不能帮助找回身份。

浏览器登录

打开目标服务的 /login,页面显示一次性码。在持有该账号签名密钥的终端执行:

msg --server https://你的服务 --account alice auth request XXXXXXXX
msg --server https://你的服务 --account alice auth approve XXXXXXXX

只批准自己刚刚发起、目标服务正确的登录。拒绝时使用 auth deny。 页面自动完成登录,不要求输入或上传私钥。仅持有浏览器会话、API 凭据或外部账号 不能批准另一个浏览器。msg login 只显示本地身份状态和浏览器入口,不向外部服务 申请凭据;msg auth status 也检查本地身份,不刷新 OAuth 登录态。

确认码十分钟后过期,批准后只可领取一次。浏览器会话默认一小时,无刷新令牌。 会话权限不得超过来源密钥,身份管理、根管理等敏感操作仍需本地签名。 退出入口为 /session/logout;退出需要同站表单确认,单纯打开页面不会撤销会话。 每次访问都检查来源密钥、身份版本、期限、会话撤销状态和当前权限。 公开页面与 /login?format=raw 不要求登录。

部署配置

删除旧配置中的整个 [oauth]、[[oauth.clients]]、[login] 及其提供方子节。 旧字段不被静默接受,残留配置会使启动校验失败。新的可选配置只有:

[browser]
enabled = true
session_ttl = 3600

浏览器会话需要 HTTPS,只有本机开发地址例外。session_ttl 允许 60 至 86400 秒, 浏览器凭据还受来源权限和服务内较短限制约束,不保证能取得所配置的最大期限。 设置 enabled = false 可关闭浏览器会话,原生签名客户端不受影响。 不再需要提供方 client ID、client secret、邮件登录码配置或回调域名。

数据库会建立通用 credential_states 表,并在现有迁移事务内清除旧 OAuth 状态和 第三方绑定。只复制其中原生 API 凭据的来源限制,避免现有原生凭据失去撤销检查。 独立托管只读角色需要数据库所有者更新授权:

GRANT SELECT ON public.credential_states TO msgd_hosting;

使用自定义角色名时替换 msgd_hosting。升级前先创建并验证数据库及身份备份。

旧账号与升级前检查

不要直接部署到仍有人只能通过第三方登录、且没有掌握原身份密钥的实例。 应先在旧版本中,按现有的身份恢复或托管转自持流程让这些用户取得可用密钥, 备份后验证真实签名请求,再切换到新版本。新版本不能从公钥恢复未知私钥, 也不能凭邮箱或第三方声明接管旧账号。账号内容不删除,不代表所有旧用户已经 具备新版本所需的登录条件;部署者必须实际确认。

旧 cookie、授权码、刷新令牌、OAuth access token 和第三方绑定全部失效。 即使恢复迁移前的数据库,旧协议凭据也会被认证层拒绝,不能退回普通 token 认证。 旧客户端的 oauth-session.json 不再用于登录或刷新;仅保留对旧身份资料存在的 检查,避免注册或迁移覆盖尚未恢复的账号。完整回滚必须使用升级前验证过的备份。

已签署证书可能包含旧操作名称。程序只保留五个不可调用的旧操作声明,用于检查 历史证书原字节。旧浏览器批准权限只对应两项同用途的新操作,不扩大到其他权限。 原有签名、加密、证书、有限任务委派、恢复和旧托管密钥资料继续保留;这不是删除 所有原生凭据或销毁历史托管数据的迁移,也不会自动把旧托管身份改成自持密钥。

CLI、API 和 MCP

CLI 原生签名请求不需要浏览器会话。原生 API 凭据继续使用 MSG 请求证明字段, 不接受 HTTP Authorization: Bearer ... 作为替代。敏感操作仍要求签名。 标准 Git 客户端在专用 Git 路径仍可用 Basic 格式传输本地密钥签发的原生凭据; 这不是第三方登录,仍检查来源密钥、范围、撤销和请求限制,不能用于网页或 MCP 登录。

/-/mcp 的公开工具继续可用。msg_connect 给出本地密钥指引,不再触发宿主 OAuth。 私有读写使用 CLI 或 /-/mcp/raw 的签名请求格式,见协议。 依赖 OAuth 的旧第三方连接器必须更换接入方式,不能声称升级后仍已连接。

验证范围

test_browser_sessions.py 验证真实签名批准、一次性领取、过期、撤销、权限收缩及并发。 test_oauth.py 现在是移除回归:旧入口关闭、旧凭据拒绝、旧操作不可执行。 test_key_identity_migration.py 验证存储迁移可重复执行,保留原生 API 来源与账号资料。 这些是源码测试范围;是否通过、对应提交及是否部署,必须以该次测试和发布证据为准。