github.com/orderbynull/buffalo@v0.11.1/middleware/basicauth/basicauth.go (about) 1 package basicauth 2 3 import ( 4 "encoding/base64" 5 "net/http" 6 "strings" 7 8 "github.com/gobuffalo/buffalo" 9 "github.com/pkg/errors" 10 ) 11 12 var ( 13 // ErrNoCreds is returned when no basic auth credentials are defined 14 ErrNoCreds = errors.New("no basic auth credentials defined") 15 16 // ErrAuthFail is returned when the client fails basic authentication 17 ErrAuthFail = errors.New("invalid basic auth username or password") 18 ) 19 20 // Authorizer is used to authenticate the basic auth username/password. 21 // Should return true/false and/or an error. 22 type Authorizer func(buffalo.Context, string, string) (bool, error) 23 24 // Middleware enables basic authentication 25 func Middleware(auth Authorizer) buffalo.MiddlewareFunc { 26 return func(next buffalo.Handler) buffalo.Handler { 27 return func(c buffalo.Context) error { 28 token := strings.SplitN(c.Request().Header.Get("Authorization"), " ", 2) 29 if len(token) != 2 { 30 c.Response().Header().Set("WWW-Authenticate", `Basic realm="Basic Authentication"`) 31 return c.Error(http.StatusUnauthorized, errors.New("Unauthorized")) 32 } 33 b, err := base64.StdEncoding.DecodeString(token[1]) 34 if err != nil { 35 return ErrAuthFail 36 } 37 pair := strings.SplitN(string(b), ":", 2) 38 if len(pair) != 2 { 39 return ErrAuthFail 40 } 41 success, err := auth(c, pair[0], pair[1]) 42 if err != nil { 43 return errors.WithStack(err) 44 } 45 if !success { 46 return ErrAuthFail 47 } 48 return next(c) 49 } 50 } 51 }