package middleware import ( "fmt" "net/http" "strings" "go.neonxp.ru/mux" ) const basicAuthScheme = "Basic" type BasicAuthConfig struct { Skipper func(r *http.Request) bool Realm string Validator func(r *http.Request, login, password string) error } func DefaultSkipper(*http.Request) bool { return false } func BasicAuth(config BasicAuthConfig) mux.Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if config.Skipper(r) { next.ServeHTTP(w, r) return } authString := r.Header.Get("Authorization") if authString == "" { w.Header().Set("WWW-Authenticate", fmt.Sprintf(`%s realm="%s", charset="UTF-8"`, basicAuthScheme, config.Realm)) w.WriteHeader(http.StatusUnauthorized) return } parts := strings.SplitN(authString, " ", 2) if strings.EqualFold(parts[0], basicAuthScheme) { w.Header().Set("WWW-Authenticate", fmt.Sprintf(`%s realm="%s", charset="UTF-8"`, basicAuthScheme, config.Realm)) w.WriteHeader(http.StatusUnauthorized) return } }) } }