// BasicAuth returns an HTTP basic authentication middleware. // // For valid credentials it calls the next handler. // For invalid credentials, it sends "401 - Unauthorized" response. func BasicAuth(fn BasicValidateFunc) echo.HandlerFunc { return func(c *echo.Context) error { // Skip WebSocket if (c.Request().Header.Get(echo.Upgrade)) == echo.WebSocket { return nil } auth := c.Request().Header.Get(echo.Authorization) l := len(Basic) if len(auth) > l+1 && auth[:l] == Basic { b, err := base64.StdEncoding.DecodeString(auth[l+1:]) if err == nil { cred := string(b) for i := 0; i < len(cred); i++ { if cred[i] == ':' { // Verify credentials if fn(cred[:i], cred[i+1:]) { return nil } } } } } c.Response().Header().Set(echo.WWWAuthenticate, Basic+" realm=Restricted") return echo.NewHTTPError(http.StatusUnauthorized) } }
// A JSON Web Token middleware func JWTAuth(key string) echo.HandlerFunc { return func(c *echo.Context) error { // Skip WebSocket if (c.Request().Header.Get(echo.Upgrade)) == echo.WebSocket { return nil } auth := c.Request().Header.Get("Authorization") l := len(Bearer) he := echo.NewHTTPError(http.StatusUnauthorized) if len(auth) > l+1 && auth[:l] == Bearer { t, err := jwt.Parse(auth[l+1:], func(token *jwt.Token) (interface{}, error) { // Always check the signing method if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) } // Return the key for validation return []byte(key), nil }) if err == nil && t.Valid { // Store token claims in echo.Context c.Set("claims", t.Claims) return nil } } return he } }