package middleware import ( "fmt" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" "net/http" "strings" "time" ) const ( ApiSecret = "your-super-secret-key" // 预共享密钥 TokenExp = 1 * time.Hour // Token有效期 ) type JWTService struct { secretKey []byte expiresIn time.Duration } func NewJWTService(secret string, expiresIn time.Duration) *JWTService { return &JWTService{ secretKey: []byte(secret), expiresIn: expiresIn, } } // 生成带HMAC签名的Token func (s *JWTService) GenerateToken() (string, error) { claims := jwt.MapClaims{ "exp": time.Now().Add(s.expiresIn).Unix(), "iat": time.Now().Unix(), } token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) return token.SignedString(s.secretKey) } // 验证HMAC签名的Token func (s *JWTService) ValidateToken(tokenString string) (jwt.Claims, error) { token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, jwt.ErrSignatureInvalid } return s.secretKey, nil }) if err != nil { return nil, err } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { return claims, nil } return nil, jwt.ErrTokenInvalidClaims } // 鉴权中间件 func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Authorization header required"}) return } tokenString := strings.TrimPrefix(authHeader, "Bearer ") token, err := jwt.Parse(tokenString, func(t *jwt.Token) (interface{}, error) { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"]) } return []byte(ApiSecret), nil }) if err != nil || !token.Valid { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"}) return } c.Next() } }