Demostrates how to create a Basic Auth wrapper for httprouter Handles.
This example was taken from the httprouter package's README.
Demostrates how to create a Basic Auth wrapper for httprouter Handles.
This example was taken from the httprouter package's README.
| // Basic Auth wrapper for httprouter Handles. | |
| // See https://github.com/julienschmidt/httprouter#basic-authentication. | |
| package main | |
| import ( | |
| "bytes" | |
| "encoding/base64" | |
| "fmt" | |
| "github.com/julienschmidt/httprouter" | |
| "net/http" | |
| "log" | |
| "strings" | |
| ) | |
| func BasicAuth(h httprouter.Handle, user, pass []byte) httprouter.Handle { | |
| return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) { | |
| const basicAuthPrefix string = "Basic " | |
| // Get the Basic Authentication credentials | |
| auth := r.Header.Get("Authorization") | |
| if strings.HasPrefix(auth, basicAuthPrefix) { | |
| // Check credentials | |
| payload, err := base64.StdEncoding.DecodeString(auth[len(basicAuthPrefix):]) | |
| if err == nil { | |
| pair := bytes.SplitN(payload, []byte(":"), 2) | |
| if len(pair) == 2 && bytes.Equal(pair[0], user) && bytes.Equal(pair[1], pass) { | |
| // Delegate request to the given handle | |
| h(w, r, ps) | |
| return | |
| } | |
| } | |
| } | |
| // Request Basic Authentication otherwise | |
| w.Header().Set("WWW-Authenticate", "Basic realm=Restricted") | |
| http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized) | |
| } | |
| } | |
| func Index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { | |
| fmt.Fprint(w, "Not protected!\n") | |
| } | |
| func Protected(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { | |
| fmt.Fprint(w, "Protected!\n") | |
| } | |
| func main() { | |
| user := []byte("gordon") | |
| pass := []byte("secret!") | |
| router := httprouter.New() | |
| router.GET("/", Index) | |
| router.GET("/protected/", BasicAuth(Protected, user, pass)) | |
| log.Fatal(http.ListenAndServe(":8080", router)) | |
| } |