2013-05-17 12 views
5

Angular sets the X-XSRF-TOKEN header to the value of the XSRF-TOKEN cookie:Perché AngularJS invia l'intestazione X-XSRF-TOKEN come stringa JSON?

var xsrfValue = isSameDomain(config.url, $browser.url()) 
       ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName] 
       : undefined; 
if (xsrfValue) { 
    headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue; 
} 

Ma, se si imposta il cookie XSRF-TOKEN usando $cookieStore (per rotaie integrazione, per esempio):

$cookieStore.put("XSRF-TOKEN", "my_token"); 

the cookie is stored as JSON string:

put: function(key, value) { 
    $cookies[key] = angular.toJson(value); 
} 

Ciò significa che l'header sarà avere le doppie virgolette supplementari:

X-XSRF-TOKEN "my_token" 

Perché angolare non chiamare fromJson() quando si imposta il valore dell'intestazione in modo che l'intestazione sarà simile a questa:

X-XSRF-TOKEN my_token 

?

Questo ci salverebbe dalla rimozione delle virgolette doppie aggiuntive sul lato server.

Mi manca qualcosa di ovvio qui?

Nota: Non sto cercando soluzioni alternative. Sto cercando di capire se questo comportamento è il comportamento previsto, e se sì, qual è la logica?

+0

Non so se è il comportamento previsto, ma può avere un effetto collaterale molto desiderabile di impedire che il token XSRF venga riconosciuto quando ricevuto come cookie. Dopotutto, CSRF funziona in modo specifico perché i browser inviano i loro cookie con tutte le richieste, quindi un token posizionato in un cookie che non può essere letto correttamente potrebbe aiutare a prevenire il danneggiamento accidentale della protezione. – atk

risposta

8

Here is the official answer I got:

Il vero problema qui è che si sta tentando di utilizzare il $ cookieStore per lo scopo sbagliato. $ CookieStore è un'astrazione sopra al cookie $, che funziona con gli oggetti e li serializza su JSON. Se si si vuole assegnare il token XSRF, basta usare $ cookie per scriverlo, che funziona direttamente con le stringhe.

In altre parole, si dovrebbe fare:

$cookies["XSRF-TOKEN"] = "my_token"; // Stored as: my_token

piuttosto che:

$cookieStore.put("XSRF-TOKEN", "my_token"); // Stored as: "my_token"