Files
test_deploy/internal/http/middleware.go
Alex Shevchuk d84487d238 1
2025-08-18 17:12:04 +03:00

71 lines
1.9 KiB
Go

package http_router
import (
"git-molva.ru/Molva/molva-backend/services/api_gateway/internal/auth"
"git-molva.ru/Molva/molva-backend/services/api_gateway/internal/auth/keycloak"
"log/slog"
"net/http"
"strings"
"time"
"git-molva.ru/Molva/molva-backend/services/api_gateway/internal/config"
)
type Middleware struct {
logger *slog.Logger
authManager auth.Manager
}
type ConfigMiddleware struct {
logger *slog.Logger
keycloakCfg *config.Keycloak
}
func NewMiddleware(c *ConfigMiddleware) (*Middleware, error) {
authManager, err := keycloak.New(&keycloak.Config{
AuthServerAddr: c.keycloakCfg.BaseURL,
Realm: c.keycloakCfg.Realm,
ClientId: c.keycloakCfg.ClientId,
ClientSecret: c.keycloakCfg.ClientSecret,
})
if err != nil {
return nil, err
}
return &Middleware{
logger: c.logger,
authManager: authManager,
}, nil
}
// loggingMiddleware middleware для логирования запросов
func (m *Middleware) loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
start := time.Now()
m.logger.Info("Started request", slog.String("method", req.Method), slog.String("url", req.URL.Path))
next.ServeHTTP(w, req)
m.logger.Info("Completed request",
slog.String("path", req.URL.Path),
slog.Duration("duration", time.Since(start)))
})
}
// authMiddleware middleware для валидации и обновления токена при истечении
func (m *Middleware) authMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
token := strings.TrimPrefix(req.Header.Get("Authorization"), "Bearer ")
ok, err := m.authManager.CheckTokenIsValid(req.Context(), token)
if err != nil || !ok {
http.Error(w, "", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, req)
})
}