Rails使用AJAX设计身份验证令牌
我正在使用Desive作为身份验证系统制作基于AJAX的应用程序。我遇到的问题是,当我使用Desive with AJAX登录时,当视图发生更改并显示“注销”按钮时,单击时会显示此错误:Rails使用AJAX设计身份验证令牌,ajax,ruby-on-rails-4,devise,Ajax,Ruby On Rails 4,Devise,我正在使用Desive作为身份验证系统制作基于AJAX的应用程序。我遇到的问题是,当我使用Desive with AJAX登录时,当视图发生更改并显示“注销”按钮时,单击时会显示此错误: ActionController::InvalidAuthenticityToken in Customization::SessionsController#destroy ActionController::InvalidAuthenticityToken Parameters: {"_method"
ActionController::InvalidAuthenticityToken in Customization::SessionsController#destroy
ActionController::InvalidAuthenticityToken
Parameters:
{"_method"=>"delete",
"authenticity_token"=>"hitX5aEjoTzi3tKP3y76+c60MuJumv5mwNEjyGUOQiY="}
这里有我的Desive会话控制器用于登录的创建方法(为了实现AJAX,我不得不做一些更改):
在_success.js.erb文件中签名:
$("body").empty();
$("body").append("<%= j(render template: 'layouts/user') %>");
$("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') %>");
如何使用AJAX发送真实性令牌?我可以通过render中的locals选项将其发送给“layouts/user”并以这种方式使用吗?我有解决方案。问题是csrf_meta_标记在创建新会话时没有更新。该问题的解决方案是在sign_in_success.js.erb文件中包含额外的代码:
$("body").empty();
$("body").append("<%= j(render template: 'layouts/user') %>");
$("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”).empty();
$(“meta[name='csrf-token'])。删除()
$(“meta[name='csrf-param'])。删除()
$(“标题”)。附加(“”);
$(“标题”)。附加(“”);
$(“正文”)。追加(“”);
上面的代码首先清空body元素,然后从csrf_meta_tags helper创建的DOM meta标记中删除。之后,我们手动添加新的csrf令牌和csrf参数,这次我们的新真实性令牌被分配给meta name=“csrf令牌”
之后,当我们单击“用户/已登录”模板呈现的“注销”按钮时,我们成功注销并返回到根路径