diff --git a/.claude/skills/casdoor-sso/README.md b/.claude/skills/casdoor-sso/README.md new file mode 100644 index 0000000..53e1127 --- /dev/null +++ b/.claude/skills/casdoor-sso/README.md @@ -0,0 +1,74 @@ +# Casdoor SSO 单点登录 Skill + +本 skill 提供在 Go + go-zero 项目中集成 Casdoor SSO 的完整指南和代码模板。 + +## 适用场景 + +- 需要统一身份认证的多系统环境 +- 外部人员(监管、巡检、审计)需要访问系统 +- 已有 Casdoor 身份中心,需要对接新系统 + +## 核心特点 + +- 支持本地用户 + Casdoor 用户混合模式 +- 自动用户创建(JIT Provision) +- JWT Token 本地签发 +- 美观的回调页面 + +## 快速开始 + +### 1. 安装依赖 + +```bash +go get github.com/casdoor/casdoor-go-sdk +go get github.com/golang-jwt/jwt/v5 +``` + +### 2. 配置文件 + +```yaml +Casdoor: + Endpoint: https://your-casdoor-domain.com + ClientId: your-client-id + ClientSecret: your-client-secret + Organization: your-org + Application: your-app + RedirectUrl: http://localhost:8888/api/v1/auth/callback + JwtPublicKey: | + -----BEGIN CERTIFICATE----- + ... + -----END CERTIFICATE----- + +JWT: + Secret: your-jwt-secret + Expire: 86400 +``` + +### 3. 核心代码 + +- [配置结构](snippets/config.md) - Config 结构定义 +- [Casdoor 客户端](snippets/casdoorx.md) - SDK 封装 +- [JWT 处理](snippets/jwtx.md) - Token 签发验证 +- [回调逻辑](snippets/callback.md) - 登录回调处理 +- [用户模型](snippets/model.md) - GORM 用户模型 + +## 完整流程 + +1. 前端请求 `/api/v1/auth/login-url` 获取登录链接 +2. 用户跳转到 Casdoor 登录页面 +3. 登录成功后重定向到回调地址 +4. 后端处理回调,交换 Token,创建用户 +5. 返回本地 JWT Token +6. 前端使用 Token 访问受保护接口 + +## 注意事项 + +- 生产环境必须使用 HTTPS +- JWT Secret 需要安全保管 +- Casdoor 证书需要定期更新 +- 建议使用 state 参数防止 CSRF + +## 参考 + +- [Casdoor 官方文档](https://casdoor.org/docs/overview) +- [go-zero 文档](https://go-zero.dev) diff --git a/.claude/skills/casdoor-sso/snippets/api.md b/.claude/skills/casdoor-sso/snippets/api.md new file mode 100644 index 0000000..a2c887e --- /dev/null +++ b/.claude/skills/casdoor-sso/snippets/api.md @@ -0,0 +1,105 @@ +# API 定义 + +## devops.api + +```go +syntax = "v1" + +info( + title: "DevOps API" + desc: "DevOps 平台 API 定义" + author: "DevOps Team" + version: "1.0" +) + +type ( + // 登录相关 + LoginUrlResp { + LoginUrl string `json:"login_url"` + } + + CallbackReq { + Code string `form:"code"` + State string `form:"state,optional"` + } + + CallbackResp { + Token string `json:"token"` + ExpiresAt int64 `json:"expires_at"` + User UserInfo `json:"user"` + } + + UserInfo { + Id int64 `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Status int `json:"status"` + CreatedAt string `json:"created_at"` + } + + UserResp { + Id int64 `json:"id"` + Username string `json:"username"` + Email string `json:"email"` + Role string `json:"role"` + Status int `json:"status"` + } +) + +service devops-api { + @handler getLoginUrlHandler + get /api/v1/auth/login-url returns (LoginUrlResp) + + @handler callbackHandler + get /api/v1/auth/callback (CallbackReq) returns (CallbackResp) + + @handler getUserHandler + get /api/v1/auth/user returns (UserResp) +} +``` + +## 生成代码 + +```bash +cd backend +goctl api go -api api/devops.api -dir . +``` + +## 接口说明 + +### 1. 获取登录链接 + +**GET** `/api/v1/auth/login-url` + +**响应:** +```json +{ + "login_url": "https://casdoor.example.com/login/oauth/authorize?client_id=xxx&..." +} +``` + +### 2. 登录回调 + +**GET** `/api/v1/auth/callback?code=xxx&state=yyy` + +由 Casdoor 重定向调用,返回 HTML 页面。 + +### 3. 获取当前用户 + +**GET** `/api/v1/auth/user` + +**请求头:** +``` +Authorization: Bearer {token} +``` + +**响应:** +```json +{ + "id": 1, + "username": "testuser", + "email": "test@example.com", + "role": "member", + "status": 1 +} +``` diff --git a/.claude/skills/casdoor-sso/snippets/callback.md b/.claude/skills/casdoor-sso/snippets/callback.md new file mode 100644 index 0000000..dc30be5 --- /dev/null +++ b/.claude/skills/casdoor-sso/snippets/callback.md @@ -0,0 +1,306 @@ +# 登录回调处理 + +## Handler + +```go +package auth + +import ( + "fmt" + "html/template" + "net/http" + + "backend/internal/logic/auth" + "backend/internal/svc" + "backend/internal/types" + "github.com/zeromicro/go-zero/rest/httpx" +) + +const callbackHTMLTemplate = ` + +
+ + +Casdoor 单点登录
+,Code development,Outline
+98,Development,terminal,console cli command shell,Lucide,import { Terminal } from 'lucide-react',