2013-01-01 12 views
27

Używam AngularJS z Railsami. Mam następującą prośbę, która zbiorczo aktualizuje użytkowników.Angular JS Weryfikacja tokenu CSRF na żądanie POST

$http{ 
    method: 'POST', 
    url: $scope.update_url, 
    params: {selected_ids: userIds} 
} 

To nie może być żądanie 'GET' z powodu ograniczeń w długości URL (http://support.microsoft.com/kb/208427)

Ale na żądanie 'post', musimy mieć token autentyczności CSRF w nagłówku.

Jak ustawić Token CSRF na nagłówek żądania postu?

Odpowiedz

65

Możesz ustawić nagłówki http zgodnie z opisem w usłudze $http.

Można go ustawić globalnie:

$httpProvider.defaults.headers.post['My-Header']='value' (or) 
$http.defaults.headers.post['My-Header']='value'; 

lub dla pojedynczego żądania:

$http({ 
    headers: { 
     'My-Header': 'value' 
    } 
}); 

Oto ważny cytat z Angular:

Cross Site Zapytanie Fałszerstwo (XSRF) Ochrona XSRF jest techniką opracowaną przez , której nieautoryzowana strona może uzyskać prywatność użytkownika te dane. Angular zapewnia następujący mechanizm do przeciwdziałania XSRF. Podczas wykonywania żądań XHR usługa $ http odczytuje token z pliku cookie o nazwie XSRF-TOKEN i ustawia go jako nagłówek HTTP X-XSRF-TOKEN. Ponieważ tylko JavaScript, który działa w Twojej domenie, może odczytać plik cookie, Twój serwer może być pewny, że XHR pochodzi z JavaScriptu działającego w domenie .

Aby to wykorzystać, serwer musi ustawić token w pliku cookie odczytu sesji o nazwie JavaScript XSRF-TOKEN na pierwszym żądaniu HTTP GET . W kolejnych żądaniach innych niż GET serwer może sprawdzić, czy plik cookie pasuje do nagłówka HTTP X-XSRF-TOKEN, i dlatego upewnij się, że tylko JavaScript działający w Twojej domenie mógł odczytać token. Znacznik musi być unikalny dla każdego użytkownika i musi być weryfikowalny przez serwer (aby zapobiec tworzeniu własnych tokenów JavaScript). My, , zalecamy, aby token był skrótem do uwierzytelnienia Twojej strony internetowej o nazwie z dodatkiem soli w celu zwiększenia bezpieczeństwa.

+0

Dzięki asgoth! Czy jest to właściwy sposób na ustawienie żądania postu z ustawionym tokenem CSRF? Czy powinienem utworzyć ukryty formularz i przesłać formularz ze studenckimi identyfikatorami na ng-click()? Ale w takim razie jak mogę uzyskać dane odpowiedzi? Dzięki jeszcze raz! –

+0

Dodałem ofertę z kątowego. – asgoth

+2

Nie jestem pewien, dlaczego to rozwiązanie jest zgodne z dokumentacją Angular. Dokumenty stwierdzają, że musisz ustawić plik cookie, ale wydajesz się ustawić nagłówek ręcznie. – RevNoah

0

Niedawno w obliczu tego samego problemu i dodanie gem angular_rails_js rozwiązać go. Dla mojego zrozumienia tworzy dla każdego kontrolera szynowego plik cookie z szyną CSRF-TOKEN, który będzie catch (domyślne zachowanie HTTP) przez kątowy $ http.

Powiązane problemy