即使请求头中包含正确的x-csrf-token,也不要在Ajax帖子上设置current_user

时间:2011-09-12 20:49:35

标签: jquery ruby-on-rails ajax jquery-ui devise

使用: Rails 3.0.7 设计1.4.5 jquery-rails 1.0.14

通过ajax发布数据时,Devise没有设置current_donor。

我的请求标题如下所示:

Host    localhost:3000
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:6.0) Gecko/20100101     Firefox/6.0
Accept  */*
Accept-Language en-us,en;q=0.5
Accept-Encoding gzip, deflate
Accept-Charset  ISO-8859-1,utf-8;q=0.7,*;q=0.7
Connection  keep-alive
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With    XMLHttpRequest
x-csrf-token    UFhqJrlOA1c1sAPeUTtV/ABcq5IeqkfA842ORcIWwks=

在关联的控制器操作中,查看会话值,我发现以下内容:

{"_csrf_token"=>"UFhqJrlOA1c1sAPeUTtV/ABcq5IeqkfA842ORcIWwks=", "warden.user.donor.key"=>["Donor", [485], "$2a$10$OtkItrzVhN4Ussnqy5k1Au"], "session_id"=>"e6693e22275385a58e0915538791ea49"}

这将向我表明csrf_token与预期值匹配。然而,current_donor仍然是零。

我已经阅读了几篇关于此的帖子,实际上,在开始时,csrf_meta_tag方法不在我的布局中,并且没有设置csrf标记。

然而,现在不再是这种情况,正在设置csrf令牌,但我仍然没有得到current_donor值。

当我发出ajax get请求时,current_donor正在正确设置。

您对我应该看到的其他地方的任何建议将不胜感激。

最佳, 汤姆

2 个答案:

答案 0 :(得分:9)

之前我遇到过同样的问题。我通过包含csrf_token解决了它,如下所示

$.ajax({
    type: "GET",
    url: url,
    data: params ,
    beforeSend: function(jqXHR, settings) {
        jqXHR.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
    },
    error: function(){
        alert("An error ocurred");
    },
    success: function(){

    }
});

答案 1 :(得分:0)

我遇到了类似的问题。我不得不改变一些其他的东西。我的 xhr 请求是使用 withCredentials 作为 true 发送的,我必须使用 Rack Cors 来允许具有特定来源的资源凭据(当凭据为 true 时这是必需的)

config.middleware.insert_before 0, "Rack::Cors" do
  allow do
    origins 'my.domain.com'
    resource '/resource', headers: :any, methods: [:get], credentials: true
  end
end

然后,我的 xhr:

  var ajax = new XMLHttpRequest();
  
  ajax.open("GET", url, true);
  ajax.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  ajax.withCredentials = true;
  ajax.send();

说明

我的应用程序将会话数据存储在由 _session_id cookie 标识的数据库中。我的应用程序跨子域共享 cookie,withCredentials = true,发送第一个请求设置的 cookie。