package main import ( "fmt" "time" "github.com/golang-jwt/jwt/v4" ) type Claims struct { UserID uint `json:"user_id"` Email string `json:"email"` jwt.RegisteredClaims } func GenerateToken(userID uint, email string, secret string, expire int64) (string, error) { claims := Claims{ UserID: userID, Email: email, RegisteredClaims: jwt.RegisteredClaims{ ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(expire) * time.Second)), IssuedAt: jwt.NewNumericDate(time.Now()), }, } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) tokenString, err := token.SignedString([]byte(secret)) if err != nil { return "", err } return tokenString, nil } // VerifyToken 验证JWT令牌的有效性 // 参数: // // tokenString - JWT令牌字符串 // secret - 用于验证令牌的密钥 // // 返回值: // // *Claims - 解析出的令牌声明信息 // error - 验证过程中出现的错误 func VerifyToken(tokenString string, secret string) (*Claims, error) { claims := &Claims{} token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) { // 检查签名方法是否为HMAC if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"]) } return []byte(secret), nil }) if err != nil { return nil, err } // 验证令牌是否有效 if !token.Valid { return nil, fmt.Errorf("invalid token") } return claims, nil }