2016-01-28 14 views
11

Po wysłaniu żądania umieszczenia w Angular2, otrzymuję oczekiwany plik set-cookie w odpowiedzi. Jednak moja przeglądarka (wypróbowana zarówno w przeglądarce Chrome, jak i Firefox) odmawia ustawienia pliku cookie.Ustawiony plik cookie w odpowiedzi nie jest ustawiony dla żądania postu Angular2

Zamiast tego, gdy używam aplikacji Angular 1 wykonującej połączenie z punktem końcowym API , ten sam plik cookie jest ustawiony prawidłowo.

Nagłówki reakcji są:

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 

backend zaprogramowana Django 1.8.

Czy ktoś ma takie samo odczucie lub sugestię, jak rozwiązać ten problem?

Odpowiedz

10

Wygląda na to, że jest to problem związany z CORS. Być może możesz spróbować ustawić atrybut withCredentials podczas wykonywania żądania HTTP.

Ta odpowiedź może pomóc, aby dowiedzieć się, jak to zrobić, zwłaszcza odebrać Cedric Exbrayat „s

Edycja

Można przedłużyć BrowserXhr:

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

i zastąpić dostawcę BrowserXhr z rozszerzonym:

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

Jeśli potrzebujesz więcej wskazówek dotyczących CORS, można rzucić okiem na ten link: http://restlet.com/blog/2015/12/15/understanding-and-using-cors/.

Nadzieję, że to pomaga, Thierry

+0

Dzięki! Ale dla mnie nie jest bardzo jasne, gdzie muszę umieścić kod Cedrika :) –

+0

Myślę, że kod Cédric powinien umieścić przed wywołaniem funkcji 'bootstrap'. Zapewniam również inny sposób, który powinien działać, ale nie przetestowałem go ... –

+0

Skończyło się na tym, że wstawiłem go do konstruktora mojej usługi APi. Dzięki! :) –

19

Rzeczywiście CORS problem. Od Angular2 na RC2, wystarczy

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

coresponding angle 2 docs: https://angular.io/docs/ts/latest/api/http/index/RequestOptions-class.html – haja

0

miałem ten sam problem, ale dla mnie cookie miał ścieżkę „/ api/zamówienia” .. Więc tylko prośba do tej ścieżki zawarte cookie .. Zmieniłem ścieżkę na "/" i teraz everthig jest w porządku ..

Powiązane problemy