config CORS в Gorilla Mux: ошибка 403 при запросе POST

У меня есть API, в настоящее время я пытаюсь использовать одну из его конечных точек. Конечная точка предназначена для запросов POST, конечная точка работает должным образом. API работает в облаке, я протестировал его с помощью curl, и он был идеальным, затем из моего приложения для реагирования я попытался использовать его, но получил 403 status code.

Наблюдая в консоли браузера, я вижу, что получаю эту ошибку при запросе OPTIONS, а POST никогда не выполняется. Вот скриншот результата, отображаемого в консоли:

введите здесь описание изображения

Затем я сделал простой HTML-файл с формой, поместил туда необходимые входные данные и действие, указывающее на эту конечную точку, и это сработало довольно хорошо. Тогда я не знаю, где будет ошибка? Я включил CORS в API

В API я использую Gorilla/mux, и у меня есть что-то вроде этого:

// Set up a router and some routes
    r := mux.NewRouter()
    r.HandleFunc("/", handleHome)
    //some other routes

    headersOk := handlers.AllowedHeaders([]string{"*"})
    originsOk := handlers.AllowedOrigins([]string{"*"})
    methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})

    // Start http server
    port := fmt.Sprintf(":%d", SomePort)
    http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(r))

С использованием:

"github.com/gorilla/mux"
"github.com/gorilla/handlers"

Сообщение, которое я получаю в браузере (на испанском языке):

Запрашивать блокировку другого происхождения: политическую информацию о происхождении, читая рекурсию удаленно, на https://miURL (razón: falta la cabecera CORS 'Access-Control-Allow-Origin').

На английском: в основном сервер отклоняет запрос, потому что отсутствует заголовок CORS.

Итак, что я сделал не так в настройках роутера?


person Sredny M Casanova    schedule 30.08.2017    source источник
comment
Это не имеет ничего общего с reactjs, но с ajax и вашим API в целом. Какие заголовки запросов вы отправляете? Если вы отправляете заголовки, отличные от перечисленных в fetch.spec.whatwg.org /#cors-safelisted-request-header вызывает предварительную проверку запроса, и ваш API отправляет 403 в запросе OPTIONS. Проверьте свой API.   -  person cowbert    schedule 30.08.2017
comment
@ковберт правильно! это единственные заголовки, которые отправляются   -  person Sredny M Casanova    schedule 30.08.2017
comment
Как отмечено в комментариях на stackoverflow.com/questions/45967591/ config-cors-in-gorilla-mux кажется, что ваш запрос добавляет заголовок запроса osn — вместе с добавлением Access-Control-Allow-Origin, в котором определенно нет необходимости — и это то, что вызывает Браузер, чтобы выполнить предварительную проверку OPTIONS. И, как также упоминалось в комментариях к этому другому вопросу, проблема заключается в том, что ваш сервер отвечает запросом 403 for OPTIONS на любой URL-адрес, на который вы отправляете запрос. Поэтому вам нужно настроить серверную часть так, чтобы она не требовала аутентификации для запроса OPTIONS на этот маршрут.   -  person sideshowbarker    schedule 31.08.2017


Ответы (1)


С помощью rs/cors вы должны довольно легко решать проблемы CORS.

На вашем server.go

package main

import (
    . . .       
    "fmt"
    "log"
    "net/http"
    "github.com/gorilla/mux"
    "github.com/rs/cors"
    "../myhandler"
)

func main() {

fmt.Println("Settin up server, enabling CORS . . .")

  c := cors.New(cors.Options{
      AllowedOrigins: []string{"*"}, // All origins
      AllowedMethods: []string{"GET"}, // Allowing only get, just an example
  })

  router := mux.NewRouter()
  // Example handler
  router.HandleFunc("/test", myhandler.TestHandler())
  http.Handle("/", router)

  // Bind to port 8000 and pass our router in and pass the cors Handler
  log.Fatal(http.ListenAndServe(":8000"), c.Handler(router)))

  fmt.Println("Server is ready and is listening at port :8000 . . .")

}

Предположим, что на вашем testhandler.go вы хотите принять Content-Type: application/json

. . .

func TestHandler func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    return
}
person AndreaM16    schedule 04.09.2017