2016-01-28 19 views
11

Quando eseguo una richiesta di inserimento in Angular2, ricevo il set-cookie previsto nella risposta. Tuttavia il mio browser (provato sia su Chrome che su Firefox) si rifiuta di impostare il cookie.Set-cookie in risposta non impostato per richiesta post Angular2

Invece quando uso un'app Angular 1 che effettua una chiamata allo stesso endpoint API, i cookie sono impostati correttamente.

Le intestazioni di risposta sono:

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 

Il backend è programmato in Django 1.8.

Qualcuno ha provato la stessa cosa o ha un suggerimento su come risolvere questo problema?

risposta

10

Mi sembra un problema correlato a CORS. Forse potresti provare a impostare l'attributo withCredentials durante l'esecuzione della richiesta HTTP.

Questa risposta potrebbe aiutare a trovare il modo di farlo, soprattutto s' il Cedric Exbrayat risposta:

Modifica

Si potrebbe estendere il BrowserXhr:

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

e sovrascrivere il provider BrowserXhr con l'estesa:

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

Se avete bisogno di più suggerimenti su CORS, si potrebbe avere uno sguardo a questo link: http://restlet.com/blog/2015/12/15/understanding-and-using-cors/.

Spero che ti aiuta, Thierry

+0

Grazie! Ma per me non è molto chiaro dove devo mettere il codice di Cedric :) –

+0

Penso che il codice di Cédric dovrebbe mettere prima della chiamata della funzione 'bootstrap'. Vi fornisco anche un altro modo che dovrebbe funzionare ma non l'ho provato ... –

+0

Ho finito per metterlo nel costruttore del mio servizio API. Grazie! :) –

19

In effetti un problema di CORS. Da Angular2 RC2 in poi, non vi resta che

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

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

0

ho avuto lo stesso problema, ma per me il cookie ha avuto un percorso a '/ api/ordine' .. Quindi unica richiesta a questo percorso conteneva il cookie .. Ho modificato il percorso per "/" e ora tutto va bene ..

Problemi correlati