我正在使用Devise作为身份验证系统来创建基于AJAX的应用程序。我遇到的问题是,当我使用AJAX登录Devise时,当出现视图更改和注销按钮时,它会在单击时显示此错误:
ActionController::InvalidAuthenticityToken in Customization::SessionsController#destroy
ActionController::InvalidAuthenticityToken
Parameters:
{"_method"=>"delete",
"authenticity_token"=>"hitX5aEjoTzi3tKP3y76+c60MuJumv5mwNEjyGUOQiY="}
这里有你的设计会话控制器的登录创建方法(我不得不改变一些事情来使AJAX发生):
# POST /resource/sign_in
def create
self.resource = warden.authenticate!(auth_options)
sign_in(resource_name, resource)
yield resource if block_given?
if user_signed_in?
flash[:logged] = "Zalogowany"
respond_to do |format|
format.html { redirect_to root_path }
format.js { render "sign_in_success.js.erb" }
end
end
end
sign_in_success.js.erb文件:
$("body").empty();
$("body").append("<%= j(render template: 'layouts/user') %>");
“布局/用户”中的按钮:
a href="#{destroy_user_session_path}" data-method="delete" rel="nofollow"
button.btn.btn-primary.m-r-20 type="button"
b Log Out
如何使用AJAX发送Authenticity Token?我可以通过渲染中的locals选项将它发送到“layouts / user”并以这种方式使用吗?
答案 0 :(得分:0)
我有解决方案。问题是csrf_meta_tags在创建新会话时未更新。该问题的解决方案是在sign_in_success.js.erb文件中包含其他代码:
$("body").empty();
$("meta[name='csrf-token']").remove()
$("meta[name='csrf-param']").remove()
$("head").append("<meta name='csrf-token' content='<%= form_authenticity_token %>'>");
$("head").append("<meta name='csrf-param' content='<%= request_forgery_protection_token %>'>");
$("body").append("<%= j(render template: 'user/logged_signed') %>");
首先看到上面的代码我们正在使用body元素,然后我们从csrf_meta_tags帮助器创建的DOM元标记中删除。之后我们手动添加新的csrf-token和csrf-param,这次我们的新真实性令牌被分配给meta name =“csrf-token”。
之后,当我们点击“user / logged_signed”模板呈现的log_out按钮时,我们会成功注销并返回root_path。