package util import ( "errors" "time" "github.com/golang-jwt/jwt/v5" ) // Claims JWT载荷结构 type Claims struct { Username string `json:"username"` jwt.RegisteredClaims } // GenerateToken 生成JWT token func GenerateToken(username string, secret string, expiry time.Duration) (string, error) { if username == "" { return "", errors.New("username cannot be empty") } if secret == "" { return "", errors.New("secret cannot be empty") } expirationTime := time.Now().Add(expiry) claims := &Claims{ Username: username, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(expirationTime), IssuedAt: jwt.NewNumericDate(time.Now()), Issuer: "pansou", }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString([]byte(secret)) } // ValidateToken 验证JWT token func ValidateToken(tokenString string, secret string) (*Claims, error) { if tokenString == "" { return nil, errors.New("token cannot be empty") } if secret == "" { return nil, errors.New("secret cannot be empty") } claims := &Claims{} 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 []byte(secret), nil }) if err != nil { return nil, err } if !token.Valid { return nil, errors.New("invalid token") } return claims, nil }