// Package modkit — общее для служб модулей bj (bj-npr, bj-quikexport, …). // // Службы модулей слушают только локальный адрес и принимают запросы только от bj-server: // он проверяет вход, права и лицензию и передаёт служебный ключ в X-BJ-Module-Key // (файл /var/lib/bj/.bj/module.key создаёт bj-server, службы читают его от того же пользователя). package modkit import ( "crypto/subtle" "net/http" "os" "strings" ) // RequireKey — пропускает запросы только со служебным ключом (кроме /healthz). // Ключ читается при каждом запросе, поэтому его замена не требует перезапуска службы. func RequireKey(keyPath string, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/healthz" { next.ServeHTTP(w, r) return } key, err := os.ReadFile(keyPath) want := strings.TrimSpace(string(key)) got := r.Header.Get("X-BJ-Module-Key") if err != nil || want == "" || subtle.ConstantTimeCompare([]byte(want), []byte(got)) != 1 { http.Error(w, "модуль принимает запросы только от bj-server", http.StatusForbidden) return } next.ServeHTTP(w, r) }) }