认证与订阅体系(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)与 orgyaogal;account-portalapp 与自定义 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 → 建 orgyaogal→ 建 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 期间发现,均已回修)¶
坑 |
结论 |
|---|---|
镜像命名空间 |
|
默认 admin 用户名 |
|
login API 请求体 |
必须带 |
|
必须加引号( |
sl-01 无外网直连 |
docker |
已知遗留(安全相关)¶
危险
Casdoor admin 密码仍是种子默认 admin / 123,且管理 UI 经 auth.yaogal.com
公网可达。尽快:登录 → User Management → admin → 修改密码,并同步
casdoor/.env 的 CASDOOR_ADMIN_PASSWORD。