SubLaneSubLane

登录与初始化

首次创建管理员、浏览器会话与反向代理配置。

首次初始化

启动实例后打开页面,未初始化的数据库进入 /setup 欢迎页。点击开始后,先填写管理员登录信息,再进入第二步为第一个工作空间命名。提交第二步时才会一并创建管理员和空间并自动登录;无需额外初始化密钥。

先在本地完成初始化,再向团队开放服务;未完成时,能访问页面的人都可以创建第一个管理员。默认监听与 Compose 主机端口绑定 loopback。管理员、首个工作空间、所有者成员资格和会话在同一事务提交,初始化完成后重启不会重新开放。

用户名为 3–32 个 ASCII 字母、数字、下划线或连字符,以字母或数字开头,大小写不敏感并存为小写。新密码为 8–20 个 Unicode 字符,不会自动去除空白。已有旧密码登录保留最长 128 字符兼容。

浏览器会话

会话通过 HttpOnly、SameSite=Lax Cookie 传输,SQLite 只保存随机令牌的 SHA-256 摘要。有效期 12 小时,不滑动续期,每人最多 5 个会话,新登录仅替换自己的最旧超额会话。

正常重启保留会话,退出先撤销数据库会话,再清除 Cookie。浏览器只在本地保存主题与语言偏好,不保存会话令牌。页面在聚焦与定期检查时同步会话状态,失效后回到登录。

忘记管理员密码使用 本地恢复命令,不要删除数据库。管理员可以创建成员或通过邀请链接让新成员自行注册;当前没有开放式注册。

双重验证与通行密钥

所有用户都可在偏好设置(/preferences)中管理认证方式。设置绑定全局登录账户,在所有工作区生效。

  • 验证器 2FA:点击「启用 2FA」,确认密码,用验证器扫描二维码或手动输入设置密钥,再用新验证码完成启用。立即保存 10 个恢复码;每个只能使用一次,可代替验证器验证码。关闭后不再展示,更换后所有旧码失效。
  • 密码登录:启用后,正确密码还需新验证码或未使用的恢复码,验证完成前不会发放会话。动态码以 30 秒为周期,允许前后一个周期的时钟偏差,已使用的周期不可重放。
  • 通行密钥(Passkey):添加名称并完成设备提示,最多 10 个。通过指纹、面容或设备 PIN 验证后可直接免密码登录,也满足双重验证要求。

添加或删除通行密钥、停用 2FA、更换恢复码时,需要当前密码,以及已启用的第二因素。修改后保留当前会话,撤销其他浏览器会话,并使未完成的设置失效。普通密码修改和远程成员密码重置保留认证因素;本地管理员恢复命令会清除管理员的 TOTP、恢复码、通行密钥和所有浏览器会话,详见团队控制。

通行密钥需要 HTTPS(localhost 开发除外),以及支持 WebAuthn JSON API 的浏览器。密钥绑定站点主机名;更换主机名后需重新注册。反向代理后请将 SUBLANE_PUBLIC_URL 设为浏览器实际访问的 origin。

TOTP 密钥使用实例的 credentials.key 加密,恢复码只保存 SHA-256 摘要。新备份会用独立密码加密数据库与匹配的密钥,请将密码分开保管。可通过 SUBLANE_CREDENTIALS_KEY_FILE 将运行密钥放在数据目录外,迁移步骤见备份与恢复。恢复后保留认证方式,但清除会话和未完成的浏览器挑战。设置与 Passkey 挑战在 5 分钟后失效,Passkey 挑战还绑定浏览器且只能使用一次。设置密钥与恢复码不会写入浏览器持久存储。

HTTPS 与反向代理

网络部署在反向代理终止 HTTPS,并设置浏览器实际访问的 origin:

配置对外访问地址
SUBLANE_PUBLIC_URL=https://sublane.example.com

后端绑定 loopback 或私有网络。浏览器写操作验证精确 origin,不会隐式信任转发的 Host、协议或来源地址头。开发时 Vite 代理必须保留 Host,使用 changeOrigin: false。

认证有进程内、按来源与全局的频率限制;反向代理后用户可能共享代理的来源预算。验证码还受独立的账户级限制:每分钟最多 5 次失败验证,成功后清除失败计数,最多跟踪 1,024 个账户。限流状态在进程重启后清空。密码哈希最多同时执行两次。相关限制不是整个进程内存占用的保证。

认证接口

接口作用
GET /api/auth/state公开读取初始化状态与当前用户
POST /api/auth/setup未初始化时创建管理员、命名首个工作空间
POST /api/auth/login使用 username、password 登录;启用 2FA 时还需 code
POST /api/auth/register使用有效邀请链接创建成员账号并登录
POST /api/auth/passkey/begin、finish开始和完成通行密钥登录
GET /api/me/security读取自己的认证状态与通行密钥元数据
POST /api/me/totp、/api/me/totp/confirm开始并确认验证器设置
DELETE /api/me/totp验证密码与第二因素后停用 2FA
POST /api/me/recovery-codes验证密码与第二因素后更换恢复码
POST /api/me/passkeys/begin、finish开始并完成通行密钥注册
DELETE /api/me/passkeys/{id}验证密码与第二因素后删除自己的通行密钥
POST /api/auth/logout同源、空 JSON 请求体,撤销当前会话
POST /api/members/invitations管理员创建有效期 7 天、只能使用一次的邀请链接
GET /healthz、GET /readyz存活与就绪探针

管理接口默认要求管理员,明确的个人接口接受启用的两种角色并从会话获取所有者。模型网关使用独立 API 密钥,不能拿它登录管理后台。