package middlewares import ( "context" "strings" "go-microservices/api-gateway/internal/clients" pb "go-microservices/proto/auth" "github.com/gofiber/fiber/v2" ) // JWTMiddleware returns a Fiber middleware that validates JWT via the auth service gRPC. func JWTMiddleware(authClient *clients.AuthClient) fiber.Handler { return func(c *fiber.Ctx) error { // Try to get Authorization header (Fiber handles case-insensitivity) authHeader := c.Get("Authorization") var token string if authHeader != "" { parts := strings.Split(authHeader, " ") if len(parts) == 2 && parts[0] == "Bearer" { token = parts[1] } } // Fallback to cookie if no Bearer token found if token == "" { token = c.Cookies("access_token") } if token == "" { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "missing token"}) } // Validate token via gRPC resp, err := authClient.ValidateToken(context.Background(), &pb.ValidateTokenRequest{Token: token}) if err != nil { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "token validation failed"}) } if !resp.Valid { return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{"error": "invalid token"}) } c.Locals("userID", resp.UserId) return c.Next() } }