Как получить переменную из динамического URL с помощью gorilla / mux golang?без mux.vars () и регулярных выражений - PullRequest
0 голосов
/ 01 марта 2019

У меня есть API, который управляет различными заданиями компании, авторизует с помощью токена на предъявителя. Я хочу, чтобы пользователь выбрал одно из доступных заданий в списке задач, чтобы использовать URL / api / tasks / {task} следующим образом: / api/ tasks / checkaccount, если заданная задача отсутствует в списке задач, возвращает недействительный URL.Есть ли способ справиться с этим заданием в функции validateMiddleware?

Моя функция startApi:

func (s *ApiServerStruct) Start(interval int) {
    router := mux.NewRouter()
    log.Println("Starting the Api")
    log.Printf("Api Listen: %s\n", "127.0.0.1:8080")

    router.HandleFunc("/api/customer/newcustomer", ValidateMiddleware(s.newcustomer)).Methods("POST")
    router.HandleFunc("/api/customer/setsalary", ValidateMiddleware(s.SetSalary)).Methods("POST")
    router.HandleFunc("/api/customer/listcustomers", ValidateMiddleware(s.ListCustomers)).Methods("GET")
    router.HandleFunc("/api/customer/{login:0x[0-9a-fA-F]{40}}/newjob", ValidateMiddleware(s.NewJob)).Methods("POST")

    router.HandleFunc("/api/tasks/{task}/setnewtask", ValidateMiddleware(s.SetNewTask)).Methods("POST")

И функция validateMiddleware, которая проверяет, является ли данный токен в заголовке действительным или нет:

func ValidateMiddleware(next http.HandlerFunc) http.HandlerFunc {

    return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
        authorizationHeader := req.Header.Get("authorization")
        if authorizationHeader != "" {
            bearerToken := strings.Split(authorizationHeader, " ")
            tempData := Data[bearerToken[1]]
            secretKey := tempData["secretkey"]
            if secretKey == "" {
                json.NewEncoder(w).Encode(Exception{Message: "Invalid authorization token"})
                return
            }
            if len(bearerToken) == 2 {
                token, error := jwt.Parse(bearerToken[1], func(token *jwt.Token) (interface{}, error) {
                    if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
                        return nil, fmt.Errorf("There was an error")
                    }
                    return []byte(secretKey), nil
                })
                if error != nil {
                    json.NewEncoder(w).Encode(Exception{Message: error.Error()})
                    return
                }
                if token.Valid {
                    context.Set(req, "decoded", token.Claims)
                    next(w, req)
                } else {
                    json.NewEncoder(w).Encode(Exception{Message: "Invalid authorization token"})
                }
            }
        } else {
            json.NewEncoder(w).Encode(Exception{Message: "An authorization header is required"})
        }
    })
}
...