package utils import ( "Quincy_admin/config" "errors" "strconv" "time" "github.com/golang-jwt/jwt/v5" ) // Claims JWT 声明结构 type Claims struct { UserID int `json:"user_id"` Username string `json:"username"` SessionCode string `json:"sessioncode"` RoleCode int `json:"rolecode"` jwt.RegisteredClaims } // GenerateToken 生成 JWT token func GenerateToken(userID int, username, sessionCode string, roleCode int) (string, error) { cfg := config.LoadConfig() secretKey := []byte(cfg.Jwt.Secret) expireHours, _ := strconv.Atoi(cfg.Jwt.Expire) if expireHours <= 1 { expireHours = 1 } expirationTime := time.Now().Add(time.Duration(expireHours) * time.Hour) claims := &Claims{ UserID: userID, Username: username, SessionCode: sessionCode, RoleCode: roleCode, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(expirationTime), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "Quincy_admin", }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(secretKey) } // ParseToken 解析 JWT token func ParseToken(tokenString string) (*Claims, error) { cfg := config.LoadConfig() secretKey := []byte(cfg.Jwt.Secret) token, err := jwt.ParseWithClaims(tokenString, &Claims{}, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, errors.New("unexpected signing method") } return secretKey, nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(*Claims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") }