71 lines
1.9 KiB
Go
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)
|
|
})
|
|
}
|