Files
monibuca/pkg/auth/middleware.go

50 lines
1.3 KiB
Go

package auth
import (
"context"
"net/http"
"strings"
)
// Middleware creates a new middleware for HTTP authentication
func Middleware(validator TokenValidator) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Skip auth for login endpoint
if r.URL.Path == "/api/auth/login" {
next.ServeHTTP(w, r)
return
}
// Get token from Authorization header
authHeader := r.Header.Get("Authorization")
if authHeader == "" {
http.Error(w, "missing authorization header", http.StatusUnauthorized)
return
}
tokenString := strings.TrimPrefix(authHeader, "Bearer ")
claims, err := validator.ValidateToken(tokenString)
if err != nil {
http.Error(w, "invalid token", http.StatusUnauthorized)
return
}
// Check if token needs refresh
shouldRefresh, err := ShouldRefreshToken(tokenString)
if err == nil && shouldRefresh {
newToken, err := RefreshToken(tokenString)
if err == nil {
// Add new token to response headers
w.Header().Set("New-Token", newToken)
w.Header().Set("Access-Control-Expose-Headers", "New-Token")
}
}
// Add claims to context
ctx := context.WithValue(r.Context(), "claims", claims)
next.ServeHTTP(w, r.WithContext(ctx))
})
}
}