2016-03-05 14 views
6

Ich habe eine Ecmascript 7 Browser-Anwendung unter http://localhost:3000 in einem Firefox 44.0.2 Browser ausgeführt. Es wird auf einem Beego 1.6.0-Server veröffentlicht, der unter https://localdev.net:8443 ausgeführt wird. Das 'localdev.net' ist in der gleichen Box und löst die localhost Adresse auf. Der Browser-Code ist:CORS holen von Firefox zu Beego Server stoppt nach Pre-Flug

var serverURL = 'https://localdev.net:8443/v1/user/login' 
fetch(serverURL, { 
    method: 'post', 
    headers: { 
    'Accept': 'application/json', 
    'Content-Type': 'application/json' 
    }, 
    mode: 'cors', 
    cache: 'default', 
    body: JSON.stringify({username: this.state.username, password: this.state.password}) 
}) 
.then(function(response){ 
    if (response.status >= 200 && response.status < 300) { 
    return Promise.resolve(response) 
    } 
    return Promise.reject(new Error(response.statusText)) 
}) 
.then(function(data){ 
    console.log('data: ' + data) 
}) 
.catch((err) => console.error(serverURL, err.toString())) 

}

Der beego Server ist so konfiguriert, CORS Anfragen zu bearbeiten, wie folgt:

beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{ 
    AllowOrigins:  []string{"*"}, 
    AllowMethods:  []string{"*"}, 
    AllowHeaders:  []string{"Origin"}, 
    ExposeHeaders: []string{"Content-Length"}, 
    AllowCredentials: true, 
})) 

Wireshark sieht den Client einen Pre-Flight-CORS Optionen verlangen, um das Senden Server:

Als Antwort gibt der Bego-Server aus:

2016/03/05 12:54:29 [router.go:828][D] | OPTIONS | /v1/user/login       | 102.08µs   | not match | 

Auch wenn der Server sagt 'nicht übereinstimmen', wireshark eine Antwort erfasst:

HTTP/1.1 200 OK\r\n 
Access-Control-Allow-Credentials: true\r\n 
Access-Control-Allow-Origin: http://localhost:3000\r\n 
Access-Control-Expose-Headers: Content-Length\r\n 
Server: beegoServer:1.6.0\r\n 
Date: Sat, 05 Mar 2016 17:54:29 GMT\r\n 
Content-Length: 0\r\n 
Content-Type: text/plain; charset=utf-8\r\n 

Für mich ist der 200-Status mit einer Access-Control-Allow-Origin auf die Domäne des Browser-App zeigt an, dass die CORS vor dem Flug gelungen, aber die Firefox-Entwickler-Konsole zeigt:

"https://localdev.net:8443/v1/user/login" TypeError: NetworkError when attempting to fetch resource. 

So ist die App und/oder Firefox die Anfrage fehlgeschlagen zu denken scheint. Wireshark zeigt, dass die App keine weitere Anfrage an den Server sendet. Ich erwarte einen Post.

Es gibt eine Menge Fragen über CORS da draußen, aber die Browser/APIs/Server sind sehr variabel, so dass ich keine exakte Übereinstimmung gefunden habe. Eingraben, aber jede Hilfe wäre willkommen.

+0

Es wurde versucht, die Anfrage von Chrome auszuführen und es gibt einen zusätzlichen Fehler in der Entwicklerkonsole: "Header-Feld content-type ist nicht erlaubt von Access-Control-Allow-Header in der Preflight-Antwort." Nach diesem Fehler wird "TypeError: Failed to fetch" ausgegeben. –

+0

In der Beego-Konfiguration AllowHeaders auf "Origin, Content-Type" setzen, aber immer noch denselben Fehler erhalten. Die Antwort vor dem Flug, die von Beego gesendet wurde, enthält keine Zugriffssteuerungs-Zulassen-Kopfzeilen, die auf "Ursprung, Inhaltstyp" eingestellt sind. Ich vermute es sollte. –

Antwort

3

Behoben. Sie müssen Access-Control-Allow-Header auf [] string {"Origin", "Content-Type"} in den Beego CORS-Optionen einstellen. Dann wird die Access-Control-Erlaube-Header richtig eingestellt und der Pre-Flug ist erfolgreich. Danach ist der Hauptpost erfolgreich.