身份由密钥持有者控制,不绑定 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 凭据继续使用 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 来源与账号资料。
这些是源码测试范围;是否通过、对应提交及是否部署,必须以该次测试和发布证据为准。