Go语言HTTP Basic Authorization 实现例子

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 实现例子)