golang go cors gorilla servemux

cors golang



Haciendo funcionar a golang Gorilla CORS handler (4)

Tengo una configuración bastante simple aquí como se describe en el código a continuación. Pero no puedo hacer funcionar el CORS . Sigo recibiendo este error:

XMLHttpRequest no puede cargar http://localhost:3000/signup . La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso: no hay un encabezado ''Access-Control-Allow-Origin'' presente en el recurso solicitado. Por lo tanto, el origen '' http: // localhost: 8000 '' no tiene permitido el acceso. La respuesta tenía el código de estado HTTP 403.

Estoy seguro de que me falta algo simple aquí.

Aquí está el código que tengo:

package main import ( "log" "net/http" "github.com/gorilla/handlers" "github.com/gorilla/mux" "myApp/src/controllers" ) func main() { ac := new(controllers.AccountController) router := mux.NewRouter() router.HandleFunc("/signup", ac.SignUp).Methods("POST") router.HandleFunc("/signin", ac.SignIn).Methods("POST") log.Fatal(http.ListenAndServe(":3000", handlers.CORS()(router))) }


Debes crear un objeto CORSOption . Por ejemplo, para permitir cualquier origen, use este código:

corsObj:=handlers.AllowedOrigins([]string{"*"})

Luego pasas este objeto a tu handle.CORS Función handle.CORS :

log.Fatal(http.ListenAndServe(":3000", handlers.CORS(corsObj)(router)))

Para probarlo puedes usar CURL:

curl -H "Origin: http://example.com" / -H "Access-Control-Request-Method: POST" / -H "Access-Control-Request-Headers: X-Requested-With" / -X OPTIONS --verbose http://127.0.0.1:3000

Cuando funcione deberías ver esos encabezados:

> Accept: */* > Origin: http://example.com > Access-Control-Request-Method: POST > Access-Control-Request-Headers: X-Requested-With

El código final está aquí: https://play.golang.org/p/AOrlJsWhvf

Más información:


Lea el enlace que sugirió Markus, y también sobre qué desencadena las solicitudes previas al vuelo de CORS.

Solicitudes previas al vuelo : es posible que tenga un tipo de contenido como JSON, o algún otro encabezado personalizado que active una solicitud previa al vuelo, que su servidor no esté manejando. Intente agregar este, si está utilizando el AJAX siempre común en su interfaz: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Requested-With

Gorilla''s handlers.CORS() establecerá valores predeterminados para que los conceptos básicos de CORS funcionen para usted; sin embargo, puedes (y tal vez deberías) tomar el control de una manera más funcional.

Aquí hay un código de inicio:

headersOk := handlers.AllowedHeaders([]string{"X-Requested-With"}) originsOk := handlers.AllowedOrigins([]string{os.Getenv("ORIGIN_ALLOWED")}) methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) // start server listen // with error handling log.Fatal(http.ListenAndServe(":" + os.Getenv("PORT"), handlers.CORS(originsOk, headersOk, methodsOk)(router)))


Puede obtener más detalles aquí: "No hay encabezado ''Acceso-Control-Permitir-Origen'' en el recurso solicitado" sobre este problema.

Prueba también este controlador: Go Cors Handler, que debería resolver tu problema. Encuentro esto mucho más limpio y fácil de resolver el problema.

package main import ( "log" "net/http" "github.com/rs/cors" "github.com/gorilla/handlers" "github.com/gorilla/mux" "myApp/src/controllers" ) func main() { ac := new(controllers.AccountController) router := mux.NewRouter() router.HandleFunc("/signup", ac.SignUp).Methods("POST") router.HandleFunc("/signin", ac.SignIn).Methods("POST") c := cors.New(cors.Options{ AllowedOrigins: []string{"http://localhost:8000"}, AllowCredentials: true, }) handler := c.Handler(router) log.Fatal(http.ListenAndServe(":3000", handler ) }


package main import ( "log" "net/http" "github.com/gorilla/handlers" "github.com/gorilla/mux" "myApp/src/controllers" "github.com/rs/cors" ) func main() { ac := new(controllers.AccountController) router := mux.NewRouter() router.HandleFunc("/signup", ac.SignUp).Methods("POST") router.HandleFunc("/signin", ac.SignIn).Methods("POST") //cors optionsGoes Below corsOpts := cors.New(cors.Options{ AllowedOrigins: []string{"http://localhost:8100"}, //you service is available and allowed for this base url AllowedMethods: []string{ http.MethodGet,//http methods for your app http.MethodPost, http.MethodPut, http.MethodPatch, http.MethodDelete, http.MethodOptions, http.MethodHead, }, AllowedHeaders: []string{ "*",//or you can your header key values which you are using in your application }, }) http.ListenAndServe(":3000", corsOpts.Handler(router)) }