2013-08-16 4 views
1

У меня есть приложение Rails 4.0 с интерфейсом Ember.js. Я использую Ember-Auth совместно с Devise для проверки подлинности. По большей части все работает. Однако, если я использую загрузку файлов Jquery, то все последующие запросы к серверу приводят к ошибке InvalidAuthenticityToken. Сама загрузка файла работает отлично, но если я, например, позже посещаю страницу индекса организаций, я получу ошибку. Если я перезагружу страницу, то ошибки прекратятся, и все будет нормально работать до тех пор, пока я не выполню другую загрузку.InvalidAuthenticityToken после загрузки файла JQuery

, добавивший выглядит следующим образом:

didInsertElement: -> 
    $('#image_upload').fileupload 
    url: "/images" 
    formData: [{ name: 'auth_token', value: Whistlr.Auth.get('authToken') }] 
    success: (response) => 
     @get('parentView').get('controller').set('image_token', response.token) 

Даже если удалить все, кроме URL, я получаю InvalidAuthenticityToken потом. Любая идея, что происходит?

+0

Возможно, проблема связана с токеном csrf. Попробуйте использовать это в formData: [ {name: 'authenticity_token', value: $ ('meta [name = "csrf-token"]'). Attr ('content')} ] –

+0

К сожалению, этого не делается Хитрость. Я также попытался подключить authenticity_token ко всем транзакциям ajax, следуя [этим инструкциям] (http://blog.waymondo.com/2012-12-18-ember-dot-js-and-rails-authentication-gotchas/) , но проблема сохраняется. Любой совет будет принят во внимание! Я открыл щедрость по этому вопросу. – nullnullnull

+0

Чтение [документации Rails] (http://guides.rubyonrails.org/security.html#csrf-countermeasures), похоже, что authenticity_token специфичен для каждого сеанса. Возможно, ошибка происходит потому, что сеанс каким-то образом сбрасывается во время загрузки файла Jquery? – nullnullnull

ответ

0

Следуя моему подозрению, что сеанс сбрасывался, я попытался передать аутентичность_token обратно стороне клиента с сервера. Разумеется, он менялся. Поэтому я вручную поместил новый подлинник_token в заголовки. Код выглядит следующим образом:

def create 
    image = Image.create(image_params) 
    render json: {image: image, authenticity_token: form_authenticity_token}, status: 201 
end 

$('#image_upload').fileupload 
    url: "/images" 
    dataType: "json" 
    formData: [{ name: 'auth_token', value: Whistlr.Auth.get('authToken') }] 
    success: (response) => 
    @get('parentView').get('controller').set('image_token', response.image.token) 
    $('meta[name="csrf-token"]').attr('content', response.authenticity_token) 

Обратите внимание на последнюю строку JavaScript, которая заменяет CSRF-маркер. К счастью, это работает. Насколько я могу судить, это также безопасно. (Если вы видите недостаток в безопасности, сообщите мне об этом!) Но все же кажется странным, что это необходимо. Нигде в моем приложении я не должен вручную заменять csrf-токен. Почему это происходит здесь? Это потому, что сеанс сбрасывается, и если да, то почему это происходит здесь, но не в другом месте?

Смежные вопросы