web-dev-qa-db-fra.com

Faire fonctionner golang Gorilla CORS handler

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

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.

Voici un code de démarrage:

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)))
31
jeremiah.trein

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

Plus d'informations:

15

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 )
}
11
user5906464
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))
}
0
muthukumar