如何检查数百和数千个API端点的身份验证?

fal*_*way 4 authentication api service go web

我目前正在golang(与Gorilla)构建一个Web应用程序,并实现了一些API端点.但是,我注意到每次实现类似的功能

func CreateUserHandler(w http.ResponseWriter, r *http.Request) {}
Run Code Online (Sandbox Code Playgroud)

我必须将下面的函数添加到处理函数体中以检查请求是否被授权:

func checkAuthorizedUser (r * http.Request) error {
    uid, err := CheckRequestUser (r.Cookie("uid"))
    if err != nil {
        return errors.New("Can't find cookie value for uid")
    }
    if !IsValidUser (uid.Value) { 
        return errors.New("Not a valid user")
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

我现在发生的事情是我必须添加checkAuthorizedUser()到每个处理函数,到目前为止我已经有很多处理函数.我想知道是否有更好的方法来检查客户端是否有权访问某个端点,而不是在每个处理函数中显式检查身份验证.

wil*_*.09 6

大猩猩有一个你可以使用的路由器.然后,您可以使用身份验证检查包装路由器.像这样的东西会起作用:

func checkPermissions(h http.Handler) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        authCheck := true //implement the actual checking

        if authCheck {
            w.WriteError(w, 400, "error")
            return
        }

        h.ServeHttp(w, r)
    }
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", HomeHandler)
    r.HandleFunc("/products", ProductsHandler)
    r.HandleFunc("/articles", ArticlesHandler)
    http.Handle("/", checkPermissions(r))
}
Run Code Online (Sandbox Code Playgroud)

支持链接:

https://godoc.org/github.com/gorilla/mux#NewRouter

https://github.com/gorilla/mux