Passing the request parameter to the HTTP HTTP request handler using the MUX package

I am trying to pass an extra parameter in the request that I am trying to send to the Go server -

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

The Go server implementation is as follows:

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

How do I look and analyze a token on a Go server so that authentication succeeds?

Library function

 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 } 
+7
authentication go mux
source share
3 answers

Call FormValue to get the request parameter:

 token := req.FormValue("token") 

req is *http.Request

An alternative is to call ParseForm and directly access req.Form:

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

The OP asks in a comment how to match the token with the access_token for an external packet that is looking for access_token. Run this code before calling the external package:

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

When an external packet calls req.Form.Get("access_token") , it will receive the same value as the token parameter.

+14
source

Depending on how you want to parse the token if it comes from a form or URL.

The first answer can be used if the token is sent from the form, and in the case of a URL, I would suggest using this. It works for me

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

For url request parameters:

 mux.Vars(r)["token"] 
0
source

All Articles