# Casdoor 客户端封装 ## 代码 ```go package casdoorx import ( "context" "fmt" "github.com/casdoor/casdoor-go-sdk/casdoorsdk" ) type Client struct { client *casdoorsdk.Client } func NewClient(endpoint, clientId, clientSecret, certificate, organization, application string) *Client { client := casdoorsdk.NewClient( endpoint, clientId, clientSecret, certificate, organization, application, ) return &Client{client: client} } // GetSignInUrl 获取登录链接 func (c *Client) GetSignInUrl(state string) string { return c.client.GetSignInUrl(state) } // ExchangeToken 用 code 换取 access token func (c *Client) ExchangeToken(code string) (*casdoorsdk.AuthConfig, error) { token, err := c.client.GetOAuthToken(code, state) if err != nil { return nil, fmt.Errorf("exchange token failed: %w", err) } claims, err := c.client.ParseJwtToken(token.AccessToken) if err != nil { return nil, fmt.Errorf("parse token failed: %w", err) } return &casdoorsdk.AuthConfig{ AccessToken: token.AccessToken, Claims: claims, }, nil } // ParseToken 解析 JWT Token func (c *Client) ParseToken(token string) (*casdoorsdk.Claims, error) { return c.client.ParseJwtToken(token) } ``` ## ServiceContext 集成 ```go package svc import ( "backend/internal/casdoorx" "backend/internal/config" "backend/internal/jwtx" "backend/model" "gorm.io/driver/mysql" "gorm.io/gorm" ) type ServiceContext struct { Config config.Config DB *gorm.DB Casdoor *casdoorx.Client JWT *jwtx.JWTManager } func NewServiceContext(c config.Config) *ServiceContext { // 数据库连接 dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=true", c.MySQL.Username, c.MySQL.Password, c.MySQL.Host, c.MySQL.Port, c.MySQL.Database) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic(err) } // 自动迁移 db.AutoMigrate(&model.User{}) // Casdoor 客户端 casdoorClient := casdoorx.NewClient( c.Casdoor.Endpoint, c.Casdoor.ClientId, c.Casdoor.ClientSecret, c.Casdoor.JwtPublicKey, c.Casdoor.Organization, c.Casdoor.Application, ) // JWT 管理器 jwtManager := jwtx.NewJWTManager(c.JWT.Secret, c.JWT.Expire) return &ServiceContext{ Config: c, DB: db, Casdoor: casdoorClient, JWT: jwtManager, } } ```