From 5094ebf213243023c6325310b3f710a0974025dd Mon Sep 17 00:00:00 2001 From: Alexander Neonxp Kiryukhin Date: Sat, 31 Aug 2024 02:05:36 +0300 Subject: Обновление mux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- middleware/basic_auth.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 middleware/basic_auth.go (limited to 'middleware') diff --git a/middleware/basic_auth.go b/middleware/basic_auth.go new file mode 100644 index 0000000..847ee79 --- /dev/null +++ b/middleware/basic_auth.go @@ -0,0 +1,44 @@ +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 + } + }) + } +} -- cgit v1.2.3