package middleware import ( "context" "net/http" "strings" "github.com/golang-jwt/jwt/v5" "boc/config" "boc/handlers" ) func Auth(cfg *config.Config) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { authHeader := r.Header.Get("Authorization") if authHeader == "" { writeError(w, http.StatusUnauthorized, "missing bearer token") return } tokenString := strings.TrimPrefix(authHeader, "Bearer ") if tokenString == authHeader { writeError(w, http.StatusUnauthorized, "invalid authorization header") return } token, err := jwt.ParseWithClaims(tokenString, &handlers.Claims{}, func(token *jwt.Token) (interface{}, error) { return []byte(cfg.JWTSecret), nil }) if err != nil || !token.Valid { writeError(w, http.StatusUnauthorized, "invalid token") return } claims, ok := token.Claims.(*handlers.Claims) if !ok { writeError(w, http.StatusUnauthorized, "invalid claims") return } ctx := context.WithValue(r.Context(), "user", claims) next.ServeHTTP(w, r.WithContext(ctx)) }) } } func writeError(w http.ResponseWriter, status int, message string) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) w.Write([]byte(`{"error":"` + message + `"}`)) }