2015-01-26 12 views
7

Tôi cố gắng để vượt qua một tham số bổ sung trong yêu cầu tôi đang cố gắng để gửi đến máy chủ Go -Đi qua một tham số truy vấn để xử lý yêu cầu Go HTTP bằng cách sử dụng MUX gói

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

The Go máy chủ thực hiện là như sau -

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": 
     } 

    }) 
} 

Tôi nên xem và phân tích cú pháp mã thông báo trong máy chủ Go để xác thực thành công như thế nào?

Thư viện chức năng

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 

} 

Trả lời

14

Gọi FormValue để có được một tham số truy vấn:

token := req.FormValue("token") 

req là một sự *http.Request

Một cách khác là để gọi ParseForm và truy cập req.Form trực tiếp:

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

OP yêu cầu trong nhận xét cách ánh xạ "mã thông báo" thành "access_token" cho gói bên ngoài đang tìm kiếm "access_token". Thực thi mã này trước khi gọi gói bên ngoài:

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

Khi gói bên ngoài gọi req.Form.Get("access_token"), gói này sẽ có cùng giá trị với thông số "mã thông báo".

+0

Làm thế nào về tôi sử dụng một cái gì đó như thế này - mã thông báo: = req.URL.Query() Nhận ("token") – psbits

+0

mát. , cảm ơn, Làm cách nào để chuyển thông số mã thông báo này tới hàm Auth đang được sử dụng trong mã ở trên? Một câu hỏi khác là thư viện bên ngoài mà tôi đang sử dụng tìm kiếm thông số "access_token" và trong mã máy chủ của tôi, tôi sẽ thêm logic này để xử lý thông số "mã thông báo". Làm thế nào tôi có thể bản đồ nội bộ "mã thông báo" để "Access_token" để thư viện có thể xác thực thành công mã thông báo này được thông qua trong yêu cầu? – psbits

+0

Thư viện nhận thông số truy vấn như thế nào? Nó có sử dụng req.Form không? –

4

Tùy thuộc vào cách bạn muốn phân tích mã thông báo, nếu mã đến từ biểu mẫu hoặc URL.

Câu trả lời đầu tiên có thể được sử dụng nếu mã thông báo được gửi từ biểu mẫu trong khi trong trường hợp URL, tôi khuyên bạn nên sử dụng điều này. Này làm việc cho tôi

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

Phương thức [Truy vấn] (http://godoc.org/net/url#URL.Query) phân tích cú pháp chuỗi truy vấn mỗi khi phương thức được gọi. Các apporach ưa thích là phân tích cú pháp chuỗi truy vấn một lần bằng cách gọi [ParseForm] (http://godoc.org/net/http#Request.ParseForm) và truy cập các tham số được phân tích cú pháp trong yêu cầu [Form] (http: // godoc. trường org/net/http # Request.Form). [FormValue] (http://godoc.org/net/http#Request.FormValue) là một phương thức trợ giúp hữu ích kết hợp hai bước này. –

0

Đối url tham số truy vấn:

mux.Vars(r)["token"] 
Các vấn đề liên quan