鲲 Galgame OAuth 文档
基础路径:/api/v1
| 环境 | Base URL |
|---|---|
| 开发 | http://127.0.0.1:9277/api/v1 |
| 生产 | https://oauth.kungal.com/api/v1 |
重要约定:身份操作必须在 OAuth 完成
下游 kungal / moyu / wiki 不要在自己前端实现下列操作:
- 新用户注册(跳转到
oauth.kungal.com/auth/register?redirect=<oauth-authorize-url>,注册成功后自动 SSO 回跳)—— 详见 05-registration.md - 改邮箱(POST /auth/email/send-code + PUT /auth/email)
- 改密码(PUT /auth/password)
- 重设密码 / 启用 2FA / 管理登录设备 / 注销账号 / 撤销已授权 OAuth Client(未来)
跳转目标:注册去 /auth/register?redirect=...,账号管理去 https://oauth.kungal.com/profile。
技术上这些端点都能通过 end-user JWT 代理,但身份层操作必须集中在一个前端:安全审计单点、未来加 2FA / 异地通知时只改一处、避免邮箱劫持攻击面跨多个站点放大。
展示层操作(name / avatar / bio)可以站内提供 UI 或跳转,任选。
详细分类表 + 跳转按钮代码示例见 02-user-profile.md §身份操作 vs 展示操作。
文档索引
API 参考(按主题)
| # | 文件 | 内容 |
|---|---|---|
| 01 | oauth-endpoints.md | OAuth 2.0 协议端点:/oauth/token、/oauth/authorize、/oauth/userinfo、/oauth/revoke |
| 02 | user-profile.md | 用户自助:GET/PATCH /auth/me + POST /auth/me/avatar(含头像上传) |
| 03 | cross-service.md | 服务到服务:/users/batch、/users/search(OAuth Client Basic Auth) |
| 04 | tokens-and-errors.md | JWT Access Token claims + 完整错误码速查(OAuth 15xxx / 认证 10xxx / 通用) |
| 05 | registration.md | 用户注册流程:跳转 OAuth 注册 + 邮箱验证码 + 自动 SSO 回跳;POST /auth/register/send-code + POST /auth/register、GET /oauth/client-info;下游 PKCE 跳转示例 |
| 06 | moemoepoint.md | 设计规范(精简版):萌萌点全站统一货币(单一真源在 OAuth)。可变余额列 + append-only 审计日志 + 幂等发放/扣除 RPC + 迁移与下游接入;含"刻意没做的"清单(将来需要再升级) |
| 07 | logout.md | 登出与单点登出(RP-Initiated Logout):修复「登出后再登录直接静默登回原账号」。RP 登出须顶层跳转 OP 登出入口 GET /auth/logout;含 GET /oauth/post-logout-redirect 白名单校验 + prompt=login 强制重登;下游接入步骤 |
| 08 | creator-applications.md | 创作者申请(Creator-Role Application):申请 → 管理员审核 → 通过/拒绝(可重申)的中央队列。POST /creator/applications + GET /creator/applications/me(用户);资格门槛下游自治、角色授予归 OAuth;含「从未申请省略 data」契约 + 错误码 17001-17005 + 下游耦合点 |
| 09 | account-switching.md | ✅ 账号切换(多账号 / Account Switching)——后端 + OP 选择器已实现,下游可接入:Gmail 式多账号 + 一键切换。会话袋在 OP;切换走 prompt=select_account + login_hint 重定向(同站可用 /auth/sessions JSON API);全局活跃 = 焦点对齐(同 .kungal.com 瞬时 / moyu 跨 TLD 对齐);登出 = 撤销 + 短 TTL;管理员切入需重登(10016)。apps/web + wiki 切换器已接入,forum/moyu 待做。内部实现见 infra docs/auth/02 |
| 10 | app-directory.md | 🚧 应用目录(生态一键登录 / App Directory):注册/登录时展示「拥有一个鲲 Galgame 账号即可一键登录以下网站」。每个 OAuth client 一个 opt-in listed 开关 + logo_url/tagline/display_order;公开只读 GET /oauth/ecosystem 返回 listed client 的展示字段;下游 modal / OAuth 注册页展示「生态 strip」。对应业界 App Launcher 模式(无 OAuth 标准,属产品元数据) |
| 11 | roles.md | ⚖️ 角色与能力语义(权威定义,Tier A):全站五角色 user/creator/moderator/admin/ren 的唯一权威来源。roles claim = 角色名集合(普通用户为空数组,user 隐式);管理轴逐级包含 moderator ⊂ admin ⊂ ren,creator 为正交的「直接发布」能力;下游必须遵守的 MUST 规则 + 授予矩阵 + 当前 kungal/moyu 对 ren 的合规差距(必须整改) |
| 12 | site-roles.md | 🧩 站点域角色(site-scoped roles,权威定义,Tier A):让账号只在某一个站点持职(如「letmoe 的 moderator」),是 11 五角色契约的加法扩展(不改其语义)。site_roles claim = 按签发 client 站点定界的扁平角色名数组(access token / userinfo / /users/batch 三处出现);下游并入既有角色集喂能力函数;名策略禁 user/admin/ren(安全不变量)+ 允许自定义捆名;授予/撤销仅 OAuth 后台(admin/ren) |
完整接入指南
| 文件 | 内容 |
|---|---|
| oauth-integration-guide.md | 端到端 OAuth 接入走查:注册 client、PKCE、token 轮换、并发刷新、跨域 / 跨站坑、安全注意事项 |
| nuxt-integration-prompt.md | Nuxt 3/4 项目的快速上手指南(含 SSR 回调处理代码) |
响应格式
{
"code": 0, // 0 = 成功,非零 = 错误码
"message": "成功",
"data": { ... } // 成功时有数据;失败时一般为 null 或缺省
}
认证失败返回 HTTP 401 / 403:
/auth/me//auth/*等受保护端点(protected 组,挂middleware.Auth,见cmd/oauth/main.go)在 token 缺失 / 失效 / 过期时返回 HTTP 401 +{ code: 10001 | 10002 | 10003, message };权限不足返回 HTTP 403。下游客户端应同时检查 HTTP status 与code。完整列表见 04-tokens-and-errors.md §认证错误。
认证
OAuth 一共有三种鉴权方式,按场景区分:
| 方式 | 用在哪 | 谁有 |
|---|---|---|
| Bearer Token(用户 JWT) | /auth/* 用户自助 + /oauth/userinfo |
已登录的终端用户 |
| OAuth Client Basic Auth | /users/batch、/users/search(跨服务) |
已注册的 OAuth Client(kungal / moyu / wiki 等下游后端) |
| Admin JWT(Bearer + role=admin) | /admin/*(不在本文档范围) |
OAuth 后台管理员 |
终端用户 JWT 通过完整的 OAuth Authorization Code + PKCE 流程拿到(详见 oauth-integration-guide.md)。Client Basic Auth 的 client_id / client_secret 在 OAuth 后台创建 Client 时生成。
变更摘要
2026-06-27 角色语义定权威(重要):新增 11-roles.md——把全站五角色
user/creator/moderator/admin/ren及其能力语义定为 Tier A 权威,下游必须遵守。要点:①rolesclaim 是角色名集合,普通用户为空数组(user隐式,下游不得用「数组含user」判断登录);② 管理轴逐级包含moderator ⊂ admin ⊂ ren,任何把 claim 映射成内部权限的逻辑必须让ren ⊇ admin ⊇ moderator;③creator是正交的「直接发布 galgame」能力,不含审核/管理权。下游 kungal / moyu 必须整改对ren的处理:kungal 数值等级把ren塌成普通用户、moyu 完全不识别ren——目前仅因「ren 账号必同时持 admin」未出事,违反健壮性要求,须修复(见 11 §6)。
2026-06-14 登出修复(RP-Initiated Logout):新增 07-logout.md。修复「在 wiki / 补丁站登出后,再点登录/注册会静默登回刚才的账号」——根因是 RP 登出没清掉 OP(
oauth.kungal.com)的会话(OP 的localStorage跨 origin 清不掉 + 跨站 cookie 带不过去)。方案:RP 登出时顶层跳转到 OP 登出入口GET https://oauth.kungal.com/auth/logout?client_id=&redirect=,由 OP 清会话再回跳。新增后端GET /oauth/post-logout-redirect白名单校验 +GET /oauth/authorize的prompt=login参数。下游 kungal / moyu 必须改登出实现(见 07)。
2026-05-23 注册流程统一(L1,重要):新增 05-registration.md 文档;引入邮箱验证码两步注册——
POST /auth/register/send-code寄码 +POST /auth/register带 code 创建账号并发 token(注册即登录,返回 access_token + 写 refresh cookie);新增 GET /oauth/client-info 公开元数据端点;oauth_clients加auto_consent列,5 个第一方 client 默认开启——同意页对第一方静默跳过,用户感知是"注册完一闪回到原站点已登录"。下游 kungal / moyu 的 legacy 注册端点全部删除,"注册"按钮改为复用登录的 PKCE 跳转模式(目标 URL 换成/auth/register?redirect=<authorize_url>)。
2026-05-23 政策:明确"身份层 vs 展示层"分类。下游禁止在自己前端做改邮箱 / 改密码 / 注销账号等身份操作,必须跳转 OAuth profile。详见上方"重要约定"小节和 02-user-profile.md。
2026-05-23:新增 POST /auth/me/avatar 端点。一次性的"上传头像图片 → 写库" multipart 端点,避免下游 kungal / moyu 自己维护 image_service client。配额从 OAuth 一侧扣;老的两步法(
PATCH /auth/me { avatar_image_hash })继续保留。
2026-05-23:正式收录 POST /auth/email/send-code / PUT /auth/email / PUT /auth/password 端点文档(以前只有口头提及)。同时把对应的错误码 10004 / 10006 / 10010-10013 补全到 04-tokens-and-errors.md。
文档拆分(2026-05-23):原
api-reference.md拆为 4 个主题文件(01-04)。所有内容保留,按"OAuth 协议 / 用户自助 / 跨服务 / Token 与错误"四块组织。完整 OAuth 接入指南仍是单独的 oauth-integration-guide.md。
源:kun-galgame-infra/docs/integration/oauth/README.md