SlideStage Pro · auth-and-invites
SlideStage Pro 的认证与邀请模型
镜像文档保留源仓库使用的语言。站内 chrome 仍按你选的语言显示。
SlideStage Pro 使用关闭注册模型。用户不能随意注册,必须通过管理员创建的邀请码进入系统。
这个设计让 Pro 可以安全地部署在小团队、内网或私有 VPS 上,而不需要先实现完整的组织、多租户和公开注册体系。
核心角色
Pro v0 只需要两个角色:
admin:管理用户邀请、查看所有 deck、执行平台管理操作。- 普通用户:上传和管理自己有权限访问的 deck。
角色存储在用户记录上。Better Auth 负责身份和 session,Pro 在它之上增加角色和邀请规则。
登录
登录使用 Better Auth 的邮箱密码接口:
POST /api/auth/sign-in/email
成功后,浏览器持有 HttpOnly session cookie。前端通过 session 查询判断当前用户状态。
注册为什么需要邀请
Pro 是自托管系统。默认部署通常暴露在团队域名、内网或公网 VPS 上。如果允许开放注册,任何访问到页面的人都可能创建账号。
因此注册必须带 inviteToken。
注册请求缺少 token 或 token 无效时,服务端返回:
{
"error": {
"code": "INVITE_REQUIRED",
"message": "Invite token is required"
}
}
邀请生命周期
- 管理员创建邀请。
- 系统生成一次性 token。
- 管理员把注册链接发给新用户。
- 用户注册时提交 token。
- 服务端在创建用户前验证 token。
- 用户创建成功后,服务端标记邀请已使用,并给用户分配角色。
邀请应只能使用一次。已经使用、过期或被删除的邀请不能再次注册。
Bootstrap 管理员
首次启动时,如果数据库中还没有用户,Pro 会读取 bootstrap 环境变量创建第一个管理员。
常用变量:
BOOTSTRAP_ADMIN_EMAILBOOTSTRAP_ADMIN_PASSWORDBOOTSTRAP_ADMIN_NAME
如果系统没有任何用户,又缺少 bootstrap 配置,API 应拒绝继续服务。这样可以避免部署出一个没有管理员、但可能开放注册的站点。
Session 与 Cookie
生产环境中,session cookie 应满足:
- HttpOnly。
- SameSite=Lax。
- HTTPS 下 Secure。
BETTER_AUTH_URL与用户实际访问地址一致。
如果登录后马上变回未登录,优先检查 BETTER_AUTH_URL、反向代理协议头和公开访问域名是否一致。
前端如何使用
前端不直接读取 cookie。它通过 Better Auth client 或 session API 获取当前用户。
常见 UI 分支:
- 无 session:显示登录页。
- 有 session:进入 deck 列表。
user.role === "admin":显示邀请管理入口。
不要在前端只靠隐藏按钮保护管理员能力。服务端接口必须再次检查 admin 权限。
设计边界
Pro v0 暂不处理:
- OAuth 登录。
- Passkey / WebAuthn。
- 双因素认证。
- 多租户组织。
- 公开注册。
- 邮箱找回密码。
这些能力可以后续添加,但不应改变当前原则:注册入口必须默认关闭,管理员邀请是团队准入边界。