2015-01-26 59 views
7

我想通過在我試圖發送到去服務器請求一個額外的參數傳遞的查詢參數轉到HTTP請求處理程序如下所示 -使用MUX包

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 

} 

回答

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"),將得到相同的值作爲「令牌」參數。

+0

怎麼樣,我使用這樣的事情 - 令牌:= req.URL.Query()獲取( 「令牌」) – psbits 2015-01-26 22:06:06

+0

酷。 ,謝謝,我如何將這個令牌參數傳遞給上面代碼中使用的Auth函數? 另一個問題是,我正在使用的外部庫查找「access_token」參數,並在我的服務器代碼中,我將添加此邏輯來處理「令牌」參數。我如何在內部將「token」映射到「Access_token」,以便庫可以成功驗證在請求中傳遞的此令牌? – psbits 2015-01-26 22:16:29

+0

庫如何獲取查詢參數?它使用req.Form嗎? – 2015-01-26 22:31:28

4

取決於您想要解析令牌的方式,如果它來自表單或URL。

第一個答案可以如果令牌正在從形式發送,而在一個URL的情況下,我會建議使用此使用。這對我的作品

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

每次調用方法時,[Query](http://godoc.org/net/url#URL.Query)方法都會分析查詢字符串。首選的方法是通過調用[ParseForm](http://godoc.org/net/http#Request.ParseForm)並訪問請求[Form](http:// godoc)中的解析參數來解析查詢字符串一次。 org/net/http#Request.Form)字段。 [FormValue](http://godoc.org/net/http#Request.FormValue)是結合這兩個步驟的有用幫助方法。 – 2015-01-26 22:37:24

0

對於URL查詢參數:

mux.Vars(r)["token"]