1
This commit is contained in:
70
internal/http/middleware.go
Normal file
70
internal/http/middleware.go
Normal file
@@ -0,0 +1,70 @@
|
||||
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)
|
||||
})
|
||||
}
|
Reference in New Issue
Block a user