更換
response.headers['X-CSRF-Param'] = request_forgery_protection_token
在我的情況後,在登錄,我需要重新繪製用戶的菜單中的用戶。這很有效,但是在同一部分(當然,沒有刷新頁面),每次向服務器發送請求時都會收到CSRF真實性錯誤。以上解決方案無法正常工作,因爲我需要呈現js視圖。
我所做的這是什麼,使用設計:
應用程序/控制器/ sessions_controller.rb
class SessionsController < Devise::SessionsController
respond_to :json
# GET /resource/sign_in
def new
self.resource = resource_class.new(sign_in_params)
clean_up_passwords(resource)
yield resource if block_given?
if request.format.json?
markup = render_to_string :template => "devise/sessions/popup_login", :layout => false
render :json => { :data => markup }.to_json
else
respond_with(resource, serialize_options(resource))
end
end
# POST /resource/sign_in
def create
if request.format.json?
self.resource = warden.authenticate(auth_options)
if resource.nil?
return render json: {status: 'error', message: 'invalid username or password'}
end
sign_in(resource_name, resource)
render json: {status: 'success', message: '¡User authenticated!'}
else
self.resource = warden.authenticate!(auth_options)
set_flash_message(:notice, :signed_in)
sign_in(resource_name, resource)
yield resource if block_given?
respond_with resource, location: after_sign_in_path_for(resource)
end
end
end
之後,我提出到重繪菜單控制器#行動的請求。而在JavaScript中,我修改了X-CSRF-帕拉姆和X-CSRF令牌:
應用程序/視圖/公共事業/ redraw_user_menu.js.erb
$('.js-user-menu').html('');
$('.js-user-menu').append('<%= escape_javascript(render partial: 'shared/user_name_and_icon') %>');
$('meta[name="csrf-param"]').attr('content', '<%= request_forgery_protection_token.to_s %>');
$('meta[name="csrf-token"]').attr('content', '<%= form_authenticity_token %>');
我希望這是有用的人在相同的js情況:)
任何人都知道這個問題是否與Devise開發者一起提出? – IanWhalen 2012-12-29 04:10:33
#2對我不起作用,因爲我通過Devise/Ajax通過任何POST請求進行登錄後收到CSRF真實性錯誤。我也不確定如何渲染新的csrf標記,因爲我已經將模板渲染爲我的':create'動作的最後一步。我在這裏提出了一個問題(http://stackoverflow.com/questions/26640326/after-devise-sign-in-via-ajax-any-post-request-results-in-csrf-authenticity-err)並真的很感激,如果你有時刻檢查出來 – sixty4bit 2014-10-29 21:36:19
@ sixty4bit我似乎與你有同樣的問題,但你的問題已被刪除。你有沒有發現它? – 2015-07-21 15:01:36