package middleware import ( "net/http" "strings" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" "github.com/troneras/ghost-listmonk-connector/services" "github.com/troneras/ghost-listmonk-connector/utils" ) func AuthRequired(userService *services.UserService) gin.HandlerFunc { return func(c *gin.Context) { authHeader := c.GetHeader("Authorization") if authHeader == "" { utils.ErrorLogger.Println("Authorization header is required") c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header is required"}) c.Abort() return } bearerToken := strings.Split(authHeader, " ") if len(bearerToken) != 2 { utils.ErrorLogger.Println("Invalid token format") c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token format"}) c.Abort() return } tokenString := bearerToken[1] token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, jwt.ErrSignatureInvalid } return []byte(utils.GetConfig().JWT_SECRET), nil }) if err != nil { utils.ErrorLogger.Println("Invalid token") c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token"}) c.Abort() return } if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { userID, ok := claims["user_id"].(string) if !ok { utils.ErrorLogger.Println("Invalid user_id in token claims") c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token claims"}) c.Abort() return } user, err := userService.GetUserByID(userID) if err != nil { utils.ErrorLogger.Printf("Failed to get user: %v", err) c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid user"}) c.Abort() return } c.Set("user", user) c.Next() } else { utils.ErrorLogger.Println("Invalid token claims") c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid token claims"}) c.Abort() return } } }