Basic Authorization认证是一个比较基础的http认证方式, 简而言之就是在你访问一个需要HTTP Basic Authentication的URL的时候,如果你没有提供用户名和密码,服务器就会返回401,如果你直接在浏览器中打开,浏览器会提示你输入用户名 和密码。今天在这里咱们通过一个go语言的例子实现一下这个简单的认证方式。
- 代码中使用了中间件, 刚好又可以复习一下中间件的用法
package main
import (
"log"
"net/http"
)
// 账户
type User struct {
name string
pass string
}
// 验证失败
func AuthFailed(w http.ResponseWriter, errMsg string) {
w.Header().Set("WWW-Authenticate", `Basic realm="My REALM"`)
w.WriteHeader(401)
w.Write([]byte(errMsg))
}
// Basic Auth 中间件
func basicAuthValidateMiddleware(h func(w http.ResponseWriter, r *http.Request)) func(w http.ResponseWriter, r *http.Request) {
// 返回一个通过封装的的handleFunc
return func(w http.ResponseWriter, r *http.Request) {
// Basic Auth 校验
user, pass, ok := r.BasicAuth()
if !ok {
AuthFailed(w, "401 Unauthorized!")
return
}
// 系统账户
users := make(map[string]string)
users["lwk"] = "1234"
users["admin"] = "4321"
sysPass, exist := users[user]
if !exist || pass != sysPass {
AuthFailed(w, "401 Unauthorized Password error!")
return
}
// 真正需要处理的业务
h(w, r)
}
}
// hello world
func HelloHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello"))
}
func main() {
http.HandleFunc("/auth", basicAuthValidateMiddleware(HelloHandler))
log.Fatal(http.ListenAndServe(":8080", nil))
}
网友评论