J'ai une configuration assez simple ici, comme décrit dans le code ci-dessous. Mais je ne parviens pas à faire fonctionner la variable CORS
. Je continue à avoir cette erreur:
XMLHttpRequest ne peut pas charger http: // localhost: 3000/signup . Réponse à La requête de preflight ne passe pas la vérification du contrôle d'accès: Non 'Access - L'en-tête Control-Allow-Origin 'est présent sur la ressource demandée. Origin ' http: // localhost: 8000 ' n'est donc pas autorisé à accéder. Le la réponse avait le code d'état HTTP 403.
Je suis sûr qu'il me manque quelque chose de simple ici.
Voici le code que j'ai:
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)))
}
Veuillez lire le lien suggéré par Markus, ainsi que ce qui déclenche les demandes de pré-vol de la SCRO.
Requêtes avant le vol: vous pouvez avoir un type de contenu tel que JSON ou un autre en-tête personnalisé qui déclenche une demande avant le vol, que votre serveur ne gère peut-être pas. Essayez d’ajouter celui-ci, si vous utilisez le jamais commun AJAX dans votre interface: https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Requested-With
Le handlers.CORS()
de Gorilla définira des valeurs par défaut saines pour que les bases de CORS fonctionnent pour vous; Cependant, vous pouvez (et devriez peut-être) prendre le contrôle de manière plus fonctionnelle.
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)))
Vous devriez créer un objet CORSOption
. Par exemple, pour autoriser toute origine, utilisez ce code:
corsObj:=handlers.AllowedOrigins([]string{"*"})
Ensuite, vous passez cet objet à votre fonction handle.CORS
:
log.Fatal(http.ListenAndServe(":3000", handlers.CORS(corsObj)(router)))
Pour le tester, vous pouvez utiliser 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
Quand cela fonctionne, vous devriez voir ces en-têtes:
> Accept: */*
> Origin: http://example.com
> Access-Control-Request-Method: POST
> Access-Control-Request-Headers: X-Requested-With
Le code final est ici: https://play.golang.org/p/AOrlJsWhvf
Vous pouvez obtenir plus de détails ici: "Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée" à propos de ce problème.
Essayez également ce gestionnaire: Go Cors Handler qui devrait résoudre votre problème. Je trouve cela beaucoup plus propre et facile à résoudre le problème.
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))
}