package middleware import ( "net/http" "strings" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" ) // AuthMiddleware validates a JWT token from the Authorization header func AuthMiddleware(secret string) gin.HandlerFunc { return func(c *gin.Context) { auth := c.GetHeader("Authorization") if auth == "" { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "missing authorization header"}) return } parts := strings.SplitN(auth, " ", 2) if len(parts) != 2 || strings.ToLower(parts[0]) != "bearer" { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid authorization header"}) return } tokenStr := parts[1] token, err := jwt.Parse(tokenStr, func(t *jwt.Token) (interface{}, error) { // ensure signing method is HMAC if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { return nil, jwt.ErrTokenUnverifiable } return []byte(secret), nil }) if err != nil || !token.Valid { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "invalid token"}) return } // expose token claims to handlers if claims, ok := token.Claims.(jwt.MapClaims); ok { c.Set("claims", claims) } c.Next() } }