认证与订阅体系(Casdoor)

方向决策(2026-10):全量统一到 Casdoor;订阅数据模型走 Casdoor 原生 Plan / Subscription / Payment。Keycloak 与独立 Go billing-service 逐步退役或降级为报表层。

生产拓扑

https://auth.yaogal.com          ← 唯一 OIDC 入口(issuer)
   │  TLS: /etc/letsencrypt/live/yaogal.com/
   │       SAN: yaogal.com, www.yaogal.com, auth.yaogal.com
   │       到期 2027-01-02,certbot timer 自动续期
   ▼
sl-entry  nginx 反代(sites-enabled/auth-prod,手工维护)
   ▼
sl-01  192.168.0.134:8000  Casdoor 4.14.0 + Postgres 17(docker compose)
  • CASDOOR_ORIGIN=https://auth.yaogal.com,CASDOOR_ORIGIN_FRONTEND 同值 (否则 OIDC discovery 的 authorization_endpoint 会指错域名)。

  • sl-entry 的 default-404 配置了 ssl_reject_handshake on;:任何未匹配的 SNI 在 TLS 层直接拒绝(包括旧的 *.hidden.testing.yaogal.com)。

  • Casdoor DB 现状:只保留 app-built-in(管理 UI)与 org yaogal; account-portal app 与自定义 plans 已删除。

  • account-site 不再部署(Casdoor 自带 admin UI 够用);仓库保留,见 repos/yaogal — 主产品与 Web 前端。

部署与 bootstrap

  • 镜像与编排:repos/yaogal/docker-images/casdoor/(compose + .env); 镜像是 casbin/casdoor(Docker Hub 官方 repo,不是 casdoor/casdoor)。

  • init/init.sh 幂等 bootstrap:登录 admin → 建 org yaogal → 建 application → 可选 seed plans(init/seed/plan-{free,pro}.json)→ 写 .client-id。

  • playbook:site-deploy/playbooks/casdoor.md(部署)与 auth-proxy.md (sl-entry 反代的手工文档)。

  • 本地 smoke test 已通过(2026-10-04):discovery / JWKS / PKCE S256 / authorize 端点正常,issuer 无 /realms/ 前缀。

接入方式(应用侧)

统一接入指南:site-deploy/docs/oauth-integration.md(P1 文档,覆盖 discovery、scopes、client 命名、PKCE flow、JS/TS/Go/ArkTS 四份片段、JWKS 校验 规则、Keycloak→Casdoor 字段映射、常见坑)。速查要点:

  • 协议:OIDC Authorization Code + PKCE(S256);TOTP 与三方绑定由 Casdoor 侧支持。

  • SPA 参考实现:account-site/scripts/inject-config.mjs —— 构建前把 CASDOOR_ORIGIN 与 .client-id 注入 public/app-config.json, 检测到 /realms/ 残留直接构建失败。

  • issuer 校验:无 /realms/ 前缀(区别于 Keycloak)。

踩坑记录(smoke test 期间发现,均已回修)

坑

结论

镜像命名空间

casbin/casdoor

默认 admin 用户名

admin(小写)

login API 请求体

必须带 method:"password" + signinMethod:"Account" + username

.env 含空格的值

必须加引号(set -a; source 会把裸值当命令)

sl-01 无外网直连

docker registry-mirrors:docker.1panel.live / dockerproxy.net 可用

已知遗留(安全相关)

危险

Casdoor admin 密码仍是种子默认 admin / 123,且管理 UI 经 auth.yaogal.com 公网可达。尽快:登录 → User Management → admin → 修改密码,并同步 casdoor/.env 的 CASDOOR_ADMIN_PASSWORD。