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