// Package jwtutil 封装 JWT Token 的签发与解析 package jwtutil import ( "errors" "time" "github.com/golang-jwt/jwt/v5" "nl-game-api-gin/internal/config" ) // Claims 自定义 JWT 载荷:用户ID与角色 type Claims struct { UserID int `json:"user_id"` // 用户ID Role int `json:"role"` // 角色:1超管 2普通 jwt.RegisteredClaims } // Generate 为用户签发 Token func Generate(userID, role int) (string, error) { claims := Claims{ UserID: userID, Role: role, RegisteredClaims: jwt.RegisteredClaims{ // 过期时间从配置文件读取 ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(config.C.JWT.ExpireHours) * time.Hour)), IssuedAt: jwt.NewNumericDate(time.Now()), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(config.C.JWT.Secret)) } // Parse 解析并校验 Token,返回载荷 func Parse(tokenStr string) (*Claims, error) { token, err := jwt.ParseWithClaims(tokenStr, &Claims{}, func(t *jwt.Token) (any, error) { return []byte(config.C.JWT.Secret), nil }) if err != nil { return nil, err } claims, ok := token.Claims.(*Claims) if !ok || !token.Valid { return nil, errors.New("无效的 Token") } return claims, nil }