美文网首页
Go语言HTTP Basic Authorization 实现例

Go语言HTTP Basic Authorization 实现例

作者: MikeLue | 来源:发表于2021-04-05 20:41 被阅读0次

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

    相关文章

      网友评论

          本文标题:Go语言HTTP Basic Authorization 实现例

          本文链接:https://www.haomeiwen.com/subject/wwtjkltx.html