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) // 创建 JWT 声明 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 token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) // 签名并获取完整的 token 字符串 return token.SignedString(secretKey) } // ParseToken 解析 JWT token func ParseToken(tokenString string) (*Claims, error) { secretKey := []byte("hcq") // 解析 token 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 } // 验证并返回 claims if claims, ok := token.Claims.(*Claims); ok && token.Valid { return claims, nil } return nil, errors.New("invalid token") }