Rails使用AJAX设计身份验证令牌

时间:2014-12-12 15:18:08

标签: ajax ruby-on-rails-4 devise

我正在使用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”并以这种方式使用吗?

1 个答案:

答案 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。