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)) | |
} |