Я думаю, что чтение CSRF-значения из DOM - не лучшее решение, это просто обходной путь.
Вот форма документа официального сайта angularJS http://docs.angularjs.org/api/ng.$http :
Поскольку только JavaScript, который работает в вашем домене, может читать cookie, ваш сервер может быть уверен, что XHR поступил из JavaScript, запущенного в вашем домене.
Чтобы воспользоваться этой функцией (защита CSRF), ваш сервер должен установить токен в файле cookie сеанса, доступном для чтения JavaScript, который называется XSRF-TOKEN, при первом запросе HTTP GET. При последующих запросах, не связанных с GET, сервер может проверить соответствие файла cookie HTTP-заголовку X-XSRF-TOKEN.
Вот мое решение, основанное на этих инструкциях:
Сначала установите cookie:
# app/controllers/application_controller.rb
# Turn on request forgery protection
protect_from_forgery
after_action :set_csrf_cookie
def set_csrf_cookie
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
end
Затем мы должны проверять токен для каждого запроса, отличного от GET.
Поскольку в Rails уже есть аналогичный метод, мы можем просто переопределить его, чтобы добавить нашу логику:
# app/controllers/application_controller.rb
protected
# In Rails 4.2 and above
def verified_request?
super || valid_authenticity_token?(session, request.headers['X-XSRF-TOKEN'])
end
# In Rails 4.1 and below
def verified_request?
super || form_authenticity_token == request.headers['X-XSRF-TOKEN']
end