使用MUX包将查询参数传递给Go HTTP请求处理程序

时间:2015-01-26 21:59:38

标签: http authentication go mux

我正在尝试在我尝试发送到Go服务器的请求中传递一个附加参数 -

websocket.create_connection("ws://<ip>:port/x/y?token="qwerty")

Go服务器实现如下 -

func main() {
    err := config.Parse()
    if err != nil {
        glog.Error(err)
        os.Exit(1)
        return
    }

    flag.Parse()
    defer glog.Flush()

    router := mux.NewRouter()
    http.Handle("/", httpInterceptor(router))

    router.Handle("/v1/x", common.ErrorHandler(stats.GetS)).Methods("GET")
    router.Handle("/v1/x/y", common.ErrorHandler(stats.GetS)).Methods("GET")

    var listen = fmt.Sprintf("%s:%d", config.Config.Ip, config.Config.Port)
    err = http.ListenAndServe(listen, nil)

    if err != nil {
        glog.Error(err)
        os.Exit(1)
    }
}

func httpInterceptor(router http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
        startTime := time.Now()

        if !auth.Auth(w, req) {
            http.Error(w, "Failed authentication", 401)
            return
        }

        router.ServeHTTP(w, req)

        finishTime := time.Now()
        elapsedTime := finishTime.Sub(startTime)

        switch req.Method {
        case "GET":
        case "POST":
        }

    })
}

我应该如何查看和解析Go服务器中的令牌以便身份验证成功?

图书馆功能

func ParseFromRequest(req *http.Request, keyFunc Keyfunc) (token *Token, err error) {

    // Look for an Authorization header
    if ah := req.Header.Get("Authorization"); ah != "" {
        // Should be a bearer token
        if len(ah) > 6 && strings.ToUpper(ah[0:6]) == "BEARER" {
            return Parse(ah[7:], keyFunc)
        }
    }

    // Look for "access_token" parameter
    req.ParseMultipartForm(10e6)
    if tokStr := req.Form.Get("access_token"); tokStr != "" {
        return Parse(tokStr, keyFunc)
    }

    return nil, ErrNoTokenInRequest

}

3 个答案:

答案 0 :(得分:14)

致电FormValue以获取查询参数:

token := req.FormValue("token")

req*http.Request

另一种方法是调用ParseForm并直接访问req.Form:

if err := req.ParseForm(); err != nil {
   // handle error
}
token := req.Form.Get("token")

OP在评论中询问如何将“token”映射到“access_token”以查找外观包“access_token”。在调用外部包之前执行此代码:

if err := req.ParseForm(); err != nil {
   // handle error
}
req.Form["access_token"] = req.Form["token"]

当外部包调用req.Form.Get("access_token")时,它将获得与“token”参数相同的值。

答案 1 :(得分:4)

取决于您要解析令牌的方式,如果它来自表单或URL。

如果从表单发送令牌,可以使用第一个答案,而在URL的情况下,我建议使用它。这对我有用

token := req.URL.Query().Get("token")

答案 2 :(得分:0)

对于url查询参数:

mux.Vars(r)["token"]