web-dev-qa-db-de.com

Set-Cookie als Antwort nicht für Angular2 Post Request gesetzt

Wenn ich in Angular2 eine Put-Anfrage stelle, erhalte ich den erwarteten Set-Cookie in der Antwort. Mein Browser (versucht sowohl Chrome als auch Firefox) weigert sich jedoch, das Cookie zu setzen.

Wenn ich eine App Angular 1 benutze, die einen Aufruf des Endpunkts same API durchführt, werden die Cookies korrekt gesetzt.

Die Antwortheader sind:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://example.com
Allow:GET, PUT, HEAD, OPTIONS
Content-Type:application/json
Date:Thu, 28 Jan 2016 14:41:38 GMT
P3P:policyref="http://www.example.com/p3p.xml", CP="NON DSP COR CURa TIA"
Server:WSGIServer/0.1 Python/2.7.6
Set-Cookie:sessionid=994wl49qfsizog5bqmt57sgx9q2toa25; expires=Mon, 28-Mar-2016 14:41:37 GMT; Max-Age=5183999; Path=/
Set-Cookie:csrf=u7UQhpAphTsGYKRU6jFlLFt6NoYAhNMS; Domain=api.example.com; expires=Thu, 26-Jan-2017 14:41:38 GMT; Max-Age=31449600; Path=/
Vary:Accept, Cookie

Das Backend ist in Django 1.8 programmiert.

Hat jemand dasselbe erlebt oder hat einen Vorschlag, wie man dieses Problem lösen kann?

12
Bas van Dijk

Ich bin offenbar ein Problem im Zusammenhang mit CORS. Vielleicht könnten Sie versuchen, das withCredentials-Attribut festzulegen, wenn Sie die HTTP-Anforderung ausführen.

Diese Antwort könnte Ihnen dabei helfen, herauszufinden, wie das geht, insbesondere die Antwort von Cedric Exbrayat :

Bearbeiten

Sie könnten die BrowserXhr erweitern:

@Injectable()
export class CustomBrowserXhr extends BrowserXhr {
  constructor() {}
  build(): any {
    let xhr = super.build();
    xhr.withCredentials = true;
    return <any>(xhr);
  }
}

und überschreiben Sie den BrowserXhr-Provider mit dem erweiterten:

bootstrap(AppComponent, [
  HTTP_PROVIDERS,
  provide(BrowserXhr, { useClass: CustomBrowserXhr })
]);

Wenn Sie weitere Hinweise zu CORS benötigen, können Sie diesen Link besuchen: http://restlet.com/blog/2015/12/15/understanding-and-using-cors/ .

Ich hoffe, es hilft dir. Thierry

12

In der Tat ein CORS-Problem . Ab Angular2 RC2 brauchen Sie nur noch

this.http.get('http://my.domain.com/request', { withCredentials: true })
20
maxbellec

Ich hatte das gleiche Problem, aber für mich hatte der Cookie einen Pfad zu '/ api/order'. Also enthielt nur die Anfrage zu diesem Pfad den Cookie. Ich änderte den Pfad zu '/' und nun ist alles in Ordnung ..

1
Simon Ludwig