2016-05-17 40 views
5

C'è un server nodo che all'accettazione delle credenziali corrette di un utente, il passaporto js crea e invia un cookie di sessione nell'intestazione della richiesta per nome di set-cookie.CORS - Il cookie lato server non viene salvato sul browser chrome

Ma quando faccio una richiesta ajax dal mio browser Chrome accetta la richiesta che non aggiunge il cookie sul lato client. così quando una nuova richiesta genera dal lato client, il server non autentica e getta 401.

Sono confuso se si tratta di un problema di browser o una che mi manca qualcosa dalla richiesta AJAX

prega di aiuto.

+0

Ti capita di sapere contro quale server di dominio sta creando cookie? Uno dei possibili motivi di conflitto nel dominio dei cookie e nel dominio del sito Web. –

+0

richieste corsie semplici (quelle di terze parti) non consentono il mucking con i cookie. – dandavis

+0

È possibile condividere il codice che si sta utilizzando per eseguire la richiesta Ajax e i domini del server di autenticazione e del sito Web? Potrebbe essere un problema CORS come suggerito da @MaheshChavda; alcuni browser rifiutano di gestire l'intestazione 'Set-Cookie' quando eseguono richieste ajax tra domini. Potresti essere in grado di aggiungere le opzioni appropriate usando 'credenziali 'come suggerito in questa risposta http://stackoverflow.com/questions/8863571/cors-request-why-are-the-cookies-not-sent/8870830#8870830 o (con angolare): http://stackoverflow.com/questions/19383311/angularjs-http-does-not-seem-to-understand-set-cookie-in-the-response. –

risposta

2

Grazie per le vostre risposte. Lo stavo provando con la cosa withCredentials, ma il cookie di sessione non veniva impostato sul mio locale.

Il motivo per cui ho capito erano le origini consentite. Ho bisogno di impostare le origini consentite nel back-end.

XHR di è una richiesta sicura se viene passata con la proprietà delle credenziali. Pertanto, il browser lato client salva il cookie solo se l'origine consentita corrisponde all'origine della richiesta.

Quindi la soluzione semplice era di cambiare l'host in qualcosa che corrisponde all'origine consentita.

Alla fine del nodo Devo fare origin: 'domain.com' e al front end ho bisogno di impostare il mio server (localhost) per puntare a test.domain.com. e bingo. Ha funzionato.!

3

Se si utilizza 'recuperare', è necessario aggiungere una chiave

{ 
     headers: req.headers, 
     credentials: 'include' 
} 
+0

Mi chiedo chi ha downvoted questo dato che questo è assolutamente corretto per 'fetch()'. – Anne

+0

@Anne plz vota se si sente r8 ... – prateekbh

1

Se si utilizza richiesta XHR, allora avete bisogno di impostare withCredentials su true. Dovrebbe risolvere il problema se non si prega di fornire il codice

+0

Puoi espandere la risposta con qualche codice di esempio? – ManoDestra

1

Si è verificato questo problema utilizzando Angular 4 in Chrome (IE funzionava).

Richieste dal client su localhost: 4200 a WebApi su localhost: 24336. Aveva tutte le impostazioni CORS, "Access-Control-Allow-Credentials" value = "true" "Access-Control-Allow-Origin" value = "http: // localhost: 4200", ecc. E stava passando {withCredentials: true} in ogni richiesta, ad esempio http.post (url, {}, {withCredentials: true}).

La correzione, per me, è stato quello di impostare le RequestOptions predefinite a {withCredentials: true} seguendo la procedura https://angular.io/api/http/BaseRequestOptions e aggiungendo quanto segue ai fornitori: in app.module.ts

,{provide: RequestOptions, useClass: MyOptions}