web-dev-qa-db-fra.com

Demande d'origine croisée bloquée

J'ai donc ce gestionnaire http Go qui stocke du contenu POST) dans le magasin de données et récupère d'autres informations en réponse. Sur le serveur principal que j'utilise:

func handleMessageQueue(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    if r.Method == "POST" {

        c := appengine.NewContext(r)

        body, _ := ioutil.ReadAll(r.Body)

        auth := string(body[:])
        r.Body.Close()
        q := datastore.NewQuery("Message").Order("-Date")

        var msg []Message
        key, err := q.GetAll(c, &msg)

        if err != nil {
            c.Errorf("fetching msg: %v", err)
            return
        }

        w.Header().Set("Content-Type", "application/json")
        jsonMsg, err := json.Marshal(msg)
        msgstr := string(jsonMsg)
        fmt.Fprint(w, msgstr)
        return
    }
}

Dans mon application Firefox OS, j'utilise:

var message = "content";

request = new XMLHttpRequest();
request.open('POST', 'http://localhost:8080/msgs', true);

request.onload = function () {
    if (request.status >= 200 && request.status < 400) {
        // Success!
        data = JSON.parse(request.responseText);
        console.log(data);
    } else {
        // We reached our target server, but it returned an error
        console.log("server error");
    }
};

request.onerror = function () {
    // There was a connection error of some sort
    console.log("connection error");
};

request.send(message);

La partie entrante fonctionne bien et tout. Cependant, ma réponse est bloquée. Me donnant le message suivant:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/msgs. This can be fixed by moving the resource to the same domain or enabling CORS.

J'ai essayé beaucoup d'autres choses, mais je ne peux pas obtenir une réponse du serveur. Cependant, lorsque je change de méthode Go POST en GET et que j'accède à la page par le biais du navigateur, je reçois les données que je veux tant. Je ne peux pas vraiment décider du côté qui ne va pas et pourquoi: Go ne devrait peut-être pas bloquer ce type de demandes, mais javascript est peut-être illégal.

21
Dani

@Egidius, lors de la création d'un XMLHttpRequest, vous devez utiliser

var xhr = new XMLHttpRequest({mozSystem: true});

Qu'est-ce que mozSystem?

mozSystem Boolean: définir cet indicateur sur true permet d'établir des connexions entre sites sans demander au serveur de se connecter à l'aide de CORS. Requiert la définition de mozAnon: true, c’est-à-dire que cela ne peut pas être combiné à l’envoi de cookies ou d’autres identifiants d’utilisateur. Cela ne fonctionne que dans les applications privilégiées (révisées); cela ne fonctionne pas sur les pages Web arbitraires chargées dans Firefox.

Modifications à votre manifeste

Sur votre manifeste, n'oubliez pas d'inclure cette ligne dans vos autorisations:

"permissions": {
       "systemXHR" : {},
}
21
msaad

Vous avez besoin d'autres en-têtes, pas seulement d'accès-control-allow-Origin. Si votre demande comporte l'en-tête "Access-Control-Allow-Origin", vous devez la copier dans les en-têtes de la réponse. Si ce n'est pas le cas, vous devez cocher l'en-tête "Origine" et le copier dans la réponse. Si votre demande ne comporte pas d'en-têtes Access-Control-Allow-Origin-not Origin, vous devez renvoyer "*".

Vous pouvez lire l'explication complète ici: http://www.html5rocks.com/fr/tutorials/cors/#toc-adding-cors-support-to-the-server

et c'est la fonction que j'utilise pour écrire des en-têtes entre domaines:

func writeCrossDomainHeaders(w http.ResponseWriter, req *http.Request) {
    // Cross domain headers
    if acrh, ok := req.Header["Access-Control-Request-Headers"]; ok {
        w.Header().Set("Access-Control-Allow-Headers", acrh[0])
    }
    w.Header().Set("Access-Control-Allow-Credentials", "True")
    if acao, ok := req.Header["Access-Control-Allow-Origin"]; ok {
        w.Header().Set("Access-Control-Allow-Origin", acao[0])
    } else {
        if _, oko := req.Header["Origin"]; oko {
            w.Header().Set("Access-Control-Allow-Origin", req.Header["Origin"][0])
        } else {
            w.Header().Set("Access-Control-Allow-Origin", "*")
        }
    }
    w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
    w.Header().Set("Connection", "Close")

}
2
Karl

Vous devez placer ce code dans application.rb

config.action_dispatch.default_headers = {
        'Access-Control-Allow-Origin' => '*',
        'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
0
sivamani