2017-08-30 2 views
0

Ich habe eine API, derzeit versuche, einen seiner Endpunkte zu konsumieren. Der Endpunkt ist für POST-Anforderungen, der Endpunkt funktioniert wie erwartet. Die API läuft in der Cloud, ich habe es mit curl getestet und es war perfekt, dann von meiner Reactive-App habe ich versucht, es zu konsumieren, aber ich bekomme 403 status code.Config CORS in Gorilla Mux: 403 Fehler bei POST-Anfrage

Beobachten in der Konsole des Browsers sehe ich, dass ich diesen Fehler bei einer OPTIONS-Anfrage bekomme, und die POST nie fertig werden. Hier ist ein Screenshot des Ergebnisses in der Konsole angezeigt:

enter image description here

Dann habe ich eine einfache HTML-Datei mit einem Formular gemacht, da ich die erforderlichen Eingaben gegeben, und die Aktion zeigt auf diesen Endpunkt und es funktionierte ziemlich gut. Dann weiß ich nicht, wo der Fehler wäre? Ich habe CORS im

In der API API aktiviert Ich bin mit Gorilla/Mux und ich habe so etwas wie dies:

// Set up a router and some routes 
    r := mux.NewRouter() 
    r.HandleFunc("/", handleHome) 
    //some other routes 

    headersOk := handlers.AllowedHeaders([]string{"*"}) 
    originsOk := handlers.AllowedOrigins([]string{"*"}) 
    methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"}) 

    // Start http server 
    port := fmt.Sprintf(":%d", SomePort) 
    http.ListenAndServe(port, handlers.CORS(originsOk, headersOk, methodsOk)(r)) 

Verwendung:

"github.com/gorilla/mux" 
"github.com/gorilla/handlers" 

Die Botschaft, die ich erhalte in der Browser (in Spanisch):

Solicitud desde otro origen bloqueada: la Política de mismo origen imp Geben Sie einfach Ihre E-Mail-Adresse ein: https://miURL (Zugang: cacera CORS 'Access-Control-Allow-Origin').

In Englisch: im Grunde lehnt der Server die Anfrage ab, weil der CORS-Header nicht vorhanden ist.

Also, was habe ich bei meiner Routerkonfiguration falsch gemacht?

+2

Das hat nichts mit reactjs zu tun hat, aber Ajax akzeptieren wollen und Ihre API im Allgemeinen. Welche Anforderungsheader senden Sie? Wenn Sie Header senden, die nicht in https://fetch.spec.whatwg.org/#cors-safelisted-request-header aufgeführt sind, bewirkt dies, dass der Header die Anfrage preflightet und Ihre API 403 für die OPTIONS-Anfrage sendet. Überprüfen Sie Ihre API. – cowbert

+0

@cowbert korrekt! Das sind die einzigen Header, die gesendet werden. –

+0

Wie in den Kommentaren unter https://stackoverflow.com/questions/45967591/config-cors-in-gorilla-mux erwähnt, scheint es, dass Ihre Anfrage einen "' osn "-Anfragekopf hinzufügt - zusätzlich zum Hinzufügen eines Access-Control-Allow-Origins, das definitiv nicht hinzugefügt werden muss - und genau das löst den Browser aus, der die Preflight-Optionen ausführt. Und wie auch in den Kommentaren in dieser anderen Frage erwähnt, besteht das Problem darin, dass Ihr Server mit einer Anfrage 403 für OPTIONS auf die URL reagiert, an die Sie die Anfrage senden. Daher müssen Sie das Back-End so konfigurieren, dass keine Authentifizierung für die OPTIONS-Anforderung für diese Route erforderlich ist – sideshowbarker

Antwort

2

Mit rs/cors sollten Sie CORS Probleme ziemlich leicht lösen.

Auf Ihrem server.go

package main 

import (
    . . .  
    "fmt" 
    "log" 
    "net/http" 
    "github.com/gorilla/mux" 
    "github.com/rs/cors" 
    "../myhandler" 
) 

func main() { 

fmt.Println("Settin up server, enabling CORS . . .") 

    c := cors.New(cors.Options{ 
     AllowedOrigins: []string{"*"}, // All origins 
     AllowedMethods: []string{"GET"}, // Allowing only get, just an example 
    }) 

    router := mux.NewRouter() 
    // Example handler 
    router.HandleFunc("/test", myhandler.TestHandler()) 
    http.Handle("/", router) 

    // Bind to port 8000 and pass our router in and pass the cors Handler 
    log.Fatal(http.ListenAndServe(":8000"), c.Handler(router))) 

    fmt.Println("Server is ready and is listening at port :8000 . . .") 

} 

Und auf Ihrem testhandler.go, nehmen wir an, Sie Content-Type: application/json

. . . 

func TestHandler func(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Type", "application/json") 
    w.WriteHeader(http.StatusOK) 
    return 
} 
Verwandte Themen