账号与安全

目标读者:管理自身账号的开发者,以及维护本地评估环境的平台人员。

最小示例

/register → /verify-email → /login → /settings/account

注册与邮箱验证

在操作台选择注册,填写邮箱、显示名称和12–200个字符的密码。账号先处于 pending_verification,不能访问组织或项目。输入邮件中的8位数字验证码及注册密码后,账号变为 active,随后重新登录。验证码只在表单中输入并通过请求体提交,不放进链接;浏览器不持久保存密码或验证码。

验证码15分钟内有效,最多允许5次错误尝试。30秒后可重新获取,每个用途每小时最多发放10次;新验证码会使旧验证码失效。重复注册不会覆盖待验证账号或原密码。如果不知道原密码,先通过找回密码设置新密码,再获取新的邮箱验证码。

注册与验证码请求只返回“请求已接受”,不泄露邮箱是否注册,也不保证邮件已送达。邮件连接故障会如实显示服务不可用,待验证账号仍保留;恢复后可重发。收件人拒收与不符合发送条件的地址使用相同的泛化结果。验证与重置验证码不能跨用途使用,也不能重复消费。

密码与会话

选择“忘记密码”获取重置验证码,在“重置密码”页面填写验证码和新密码。成功后,同一事务内更新密码并撤销全部旧会话;不会自动登录,也不会把未验证账号变为已激活。邮箱仍未验证时,需要重新获取邮箱验证码。

“设置 → 账号与安全”提供修改密码和退出全部会话。修改密码必须输入当前密码,成功后退出所有会话,包括当前页面。普通退出只撤销当前会话。退出请求失败时,界面会明确显示尚未确认成功并允许重试,不会把仍可用的服务端会话当作已经退出。

每个 Admin 请求都会核对账号和真实会话状态。已撤销、过期、禁用和已注销的会话均被拒绝;恢复账号不会恢复旧会话。之前签发的附件下载链接仍按原有短期限失效,已经下载的副本不能通过退出操作收回。

注销账号

同一设置页面提供永久注销,需要当前密码和明确的确认勾选。如果你是组织最后一名有效所有者,必须先在成员页面把另一位有效、已验证的成员设为所有者。G4 不提供关闭组织来绕过此条件。

注销会清除邮箱、姓名和密码,移除所有成员关系和当前反馈负责人,撤销会话与账号验证码,并撤销由你创建或发给你的待接受邀请。历史邀请会清除你的收件邮箱。共享项目、项目密钥、反馈、附件、评论和必要审计仍保留;匿名 UUID 占位记录维持历史关联,界面显示“已注销用户”。这不代表共享业务数据或备份已被全部物理删除;相关生命周期另行处理。已注销账号不能恢复。

本地邮件与运营维护

本地 SMTP 由 Mailpit 在 1025 端口接收,可在 http://localhost:8025 查看。未配置外部转发,不使用真实生产邮箱;连接与发送都有时间上限。生产域名及真实送达仍属于后续运营验收。

只有持有数据库运维权限的人员可以使用维护命令。通过环境变量私下提供 ACCOUNT_MAINTENANCE_DATABASE_URL,然后在 Admin API 仓库执行:

: "${ACCOUNT_ID:?set the target account UUID}"
go run ./cmd/accountctl --user-id "$ACCOUNT_ID" --action disable
go run ./cmd/accountctl --user-id "$ACCOUNT_ID" --action disable --apply
go run ./cmd/accountctl --user-id "$ACCOUNT_ID" --action restore --apply

第一条是预演。重复操作幂等,仅作用于指定账号,只输出 ID、状态和数量,不输出凭据或身份字段。禁用撤销全部会话;恢复后,已验证账号回到 active,未验证账号回到 pending,均须重新登录。租户管理员不能禁用他人的全局账号,system_admin 也不能绕过 tenant membership 读取组织或项目。

Bootstrap 只在账号表为空时创建待验证的平台身份。已有账号(包括匿名占位记录)会阻止重启时自动重建账号。本地种子是单独、明确已验证的合成 fixture。旧 Alpha 账号与业务数据不迁移,须使用全新当前结构的数据集。G3 固定包保留为历史证据,当前服务器使用新的 SDK 下载包。

注销后用同一邮箱主动注册会创建全新的 UUID,并重新验证邮箱;不会继承旧会话、成员关系或邀请。维护命令的 sole_owner_organizations 表示当前没有其他有效所有者的组织数量。平台人员可以受控禁用最后一位所有者以临时冻结访问;这是保留成员关系的运营禁用,恢复账号后可重新登录。删除账号和成员降级仍必须保留有效所有者。

常见错误

下一步

继续使用开发者操作台,或查看 Admin API