2013-08-20 10 views
9

Sto sviluppando un'applicazione DJANGO + AngularJS, in cui la parte angolare non viene servita da django.Le intestazioni XSRF non sono impostate in AngularJS

ho impostato la angolare $httpProvider come segue:

myApp = angular.module('myApp', []) 

myApp.config(['$httpProvider', 
    function(provider){ 
    provider.defaults.xsrfCookieName = 'csrftoken'; 
    provider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
} 

Quindi, prima di fare qualsiasi POST, faccio un GET che imposta il cookie. Posso confermare attraverso Chrome che il cookie è impostato:

set-cookie:csrftoken=hg88ZZFEdLPnwDdN1eiNquA8YzTySdQO; expires=Tue, 19-Aug-2014 12:26:35 GMT; Max-Age=31449600; Path=/ 

(E 'visibile in termini di risorse/cookie/localhost negli strumenti di sviluppo Chrome)

Tuttavia quando faccio un post, non X-CSRFToken intestazione è stato impostato

questo è il post come registrato da Chrome:

POST /data/activities/search HTTP/1.1 
Host: localhost:14080 
Connection: keep-alive 
Content-Length: 2 
Accept: application/json, text/plain, */* 
Origin: http://localhost:14080 
X-Requested-With: XMLHttpRequest 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36 
Content-Type: application/json;charset=UTF-8 
Referer: http://localhost:14080/public/html/main.html?codekitCB=398694184.799418 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Cookie: csrftoken=hg88ZZFEdLPnwDdN1eiNquA8YzTySdQO 

Perché nessuna intestazione viene impostata? Che altro dovrei fare per attivare questa funzionalità?

(nota a margine: se mi passate manualmente l'intestazione nella chiamata $ http(), la richiesta POST funziona bene .. quindi il problema è in realtà l'intestazione non essere impostato dal AngularJS)

+0

usavo 1.0.8, ma ho scoperto che è disponibile solo dalla versione 1.2.0 – luca

risposta

8

risposta molto semplice: è disponibile solo dalla versione 1.2.0, che è al momento un candidato alla release.

+0

E questa risposta è molto sbagliato, perché Lo uso in 1.1.5. –

+0

@ OZ_ E chi dice 1.1.5, dice 1.0.x :) –

+1

no, è corretto, il nuovo modo automatico (l'unico oggetto di questa domanda) è solo da angolare 1.2, lo stai facendo manualmente (che può ancora essere utile) – luca

1
app.config(["$httpProvider", function($httpProvider) { 
    var csrfToken = getCookie('csrftoken'); 
    $httpProvider.defaults.headers.common['X-CSRFToken'] = csrfToken; 
}]) 

getCookie() prendere da https://docs.djangoproject.com/en/dev/ref/contrib/csrf/


O impostare ogni metodo separatamente

$httpProvider.defaults.headers.post['X-CS.... 
$httpProvider.defaults.headers.get['X-CS.... 
5

L'aggiornamento 1.2.0 non era sufficiente per me quando si utilizza Safari o Firefox (Chrome stava funzionando bene tutto il tempo). Il problema con Safari e Firefox era che il backend Django non inviava il cookie csrf nella risposta HTTP.

Quello che dovevo fare era aggiungere il decoratore @ensure_csrf_cookie alla mia funzione di visualizzazione che crea la pagina per Angularjs.

@ensure_csrf_token 
def my_view(request): 
    ... 

e nel file javascript:

myApp.config(function($httpProvider) { 
    $httpProvider.defaults.xsrfCookieName = 'csrftoken'; 
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken'; 
} 

Almeno per ora non ho idea del perché Chrome funziona senza di essa, ma gli altri browser non lo fanno.

+0

come importate @ensure_csrf_token? –

+0

Uh, immagino di avere un errore di battitura nell'esempio. È @ensure_csrf_cookie che può essere trovato in django.views.decorators.csrf.ensure_csrf_cookie – Janne

2

Ho avuto un problema simile ed è stata imbarazzante per colpa mia.

Il mio errore:

$.post('/url', data) 

Assicurarsi che si sta utilizzando l'oggetto $http!

$http.post('/url', data) 

'stato molto facile fare questo errore poiché entrambi sembrano funzionare altrettanto bene come l'altro, tranne che l'ex non guarda $http.defaults.headers.common['X-CSRFToken'], etc.

+0

Heh. Bel post. Non l'ho fatto ma mi fa il solletico. Ottimo per condividere i momenti del tuo viso rosso! – ErichBSchulz

1

Modifiche angolari molto frequenti e alcune risposte non funzionano con le ultime versioni. In ogni modo, dal momento angolare si aspetta un nome XSRF-TOKEN cookie e manda un colpo di testa X-XSRF-TOKEN, possiamo in alternativa semplicemente dire a Django di utilizzare questi per impostazione predefinita:

CSRF_COOKIE_NAME = 'XSRF-TOKEN' 
CSRF_HEADER_NAME = 'HTTP_X_XSRF_TOKEN' 

La prima impostazione (vedi docs) è il nome del cookie per la token csrf, mentre il secondo (vedi docs, introdotto solo in 1.9) è il rispettivo nome dell'intestazione.

scorso, appena per riferimento, non dimenticate di impostare:

CSRF_COOKIE_HTTPONLY = False 
Problemi correlati