Golang community are discuting a vendor aproach to go dependencies. This change will come as experimental in go 1.5. For now I am removing the godep dependency manager and using a vendor aproach. I still have to use the full path when importing dependencies, but when go1.5 released I just have to rename the imports and use a -vendor prefix when building the project.
111 lines
2.8 KiB
Markdown
111 lines
2.8 KiB
Markdown
# goji/httpauth [](https://godoc.org/github.com/goji/httpauth) [](https://travis-ci.org/goji/httpauth)
|
|
|
|
httpauth currently provides [HTTP Basic Authentication middleware](http://tools.ietf.org/html/rfc2617) for Go.
|
|
|
|
Note that httpauth is completely compatible with [Goji](https://goji.io/), a minimal web framework for Go, but as it satisfies http.Handler it can be used beyond Goji itself.
|
|
## Example
|
|
|
|
httpauth provides a `SimpleBasicAuth` function to get you up and running. Particularly ideal for development servers.
|
|
|
|
Note that HTTP Basic Authentication credentials are sent over the wire "in the clear" (read: plaintext!) and therefore should not be considered a robust way to secure a HTTP server. If you're after that, you'll need to use SSL/TLS ("HTTPS") at a minimum.
|
|
|
|
### Goji
|
|
|
|
```go
|
|
|
|
package main
|
|
|
|
import(
|
|
"net/http"
|
|
|
|
"github.com/zenazn/goji/web"
|
|
"github.com/zenazn/goji/web/middleware"
|
|
)
|
|
|
|
func main() {
|
|
|
|
goji.Use(httpauth.SimpleBasicAuth("dave", "somepassword"))
|
|
goji.Use(SomeOtherMiddleware)
|
|
// myHandler requires HTTP Basic Auth
|
|
goji.Get("/thing", myHandler)
|
|
|
|
goji.Serve()
|
|
}
|
|
```
|
|
|
|
If you're looking for a little more control over the process, you can instead pass a `httpauth.AuthOptions` struct to `httpauth.BasicAuth` instead. This allows you to:
|
|
|
|
* Configure the authentication realm
|
|
* Provide your own UnauthorizedHandler (anything that satisfies `http.Handler`) so you can return a better looking 401 page.
|
|
|
|
```go
|
|
|
|
func main() {
|
|
|
|
authOpts := httpauth.AuthOptions{
|
|
Realm: "DevCo",
|
|
User: "dave",
|
|
Password: "plaintext!",
|
|
UnauthorizedHandler: myUnauthorizedHandler,
|
|
}
|
|
|
|
goji.Use(BasicAuth(authOpts))
|
|
goji.Use(SomeOtherMiddleware)
|
|
goji.Get("/thing", myHandler)
|
|
|
|
goji.Serve()
|
|
}
|
|
```
|
|
|
|
### gorilla/mux
|
|
|
|
Since it's all `http.Handler`, httpauth works with gorilla/mux (and most other routers) as well:
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/goji/httpauth"
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
func main() {
|
|
r := mux.NewRouter()
|
|
|
|
r.HandleFunc("/", myHandler)
|
|
http.Handle("/", httpauth.SimpleBasicAuth("dave", "somepassword")(r))
|
|
|
|
http.ListenAndServe(":7000", nil)
|
|
}
|
|
|
|
func myHandler(w http.ResponseWriter, r *http.Request) {
|
|
|
|
w.Write([]byte("hello"))
|
|
}
|
|
```
|
|
|
|
### net/http
|
|
|
|
If you're using vanilla net/http:
|
|
|
|
```go
|
|
package main
|
|
|
|
import(
|
|
"net/http"
|
|
|
|
"github.com/goji/httpauth"
|
|
)
|
|
|
|
func main() {
|
|
http.Handle("/", httpauth.SimpleBasicAuth("dave", "somepassword")(http.HandlerFunc(hello)))
|
|
http.ListenAndServe(":7000", nil)
|
|
}
|
|
```
|
|
|
|
## Contributing
|
|
|
|
Send a pull request! Note that features on the (informal) roadmap include HTTP Digest Auth and the potential for supplying your own user/password comparison function.
|