Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用真实性令牌完成POST请求,但仍引发异常_Ruby On Rails_Ajax_Ruby On Rails 4_Csrf_Authenticity Token - Fatal编程技术网

Ruby on rails 使用真实性令牌完成POST请求,但仍引发异常

Ruby on rails 使用真实性令牌完成POST请求,但仍引发异常,ruby-on-rails,ajax,ruby-on-rails-4,csrf,authenticity-token,Ruby On Rails,Ajax,Ruby On Rails 4,Csrf,Authenticity Token,我的控制器正在响应js GET请求,在我的js.erb文件中,我正在报告用户浏览器生成的Fingerprint2浏览器数据。这是通过POST请求完成的,因为数据字符串很大,所以我插入了一个beforeSend方法来添加真实性令牌 但是,这将被ActionController::InvalidAuthenticityToken-ActionController::InvalidAuthenticityToken拒绝。当我检查时,标头看起来就像在成功的GET请求中一样: X-CSRF-Token:h

我的控制器正在响应js GET请求,在我的
js.erb
文件中,我正在报告用户浏览器生成的
Fingerprint2
浏览器数据。这是通过POST请求完成的,因为数据字符串很大,所以我插入了一个
beforeSend
方法来添加真实性令牌

但是,这将被
ActionController::InvalidAuthenticityToken-ActionController::InvalidAuthenticityToken
拒绝。当我检查时,标头看起来就像在成功的GET请求中一样:

X-CSRF-Token:hl/TgkY7k0yBG03KX9IBrsDhk2K4tUUh8JTooT7A0yYZ0l53p8lTt0F3dZvRwyS3bIkbbkuTdElP2KisozjXjw==
js代码如下所示:

(new Fingerprint2).get(function(fingerprint, components) {
  return $.ajax({
    url: "/user_browser",
    type: "post",
    beforeSend: function(xhr) {
      xhr.setRequestHeader('X-CSRF-Token',
      $('meta[name="csrf-token"]').attr('content'))
    },
    data: {
      some_id: '123',
      components: JSON.stringify(components),
      fingerprint: fingerprint
    },
    dataType: "json"
  }).success(function(data) {});
});

我找到了问题的根源。几天前,我将我的
config/session\u store.rb更改为:

MyApp::Application.config.session_store :cookie_store, key: '_my-app_session'
致:


当我把它改回来时,问题就消失了。

我找到了问题的根源。几天前,我将我的
config/session\u store.rb更改为:

MyApp::Application.config.session_store :cookie_store, key: '_my-app_session'
致:


当我将此更改回原处时,问题消失了。

以防万一,您确定可以从外部获取csrf令牌并使用它,而不是为您的请求生成一个新令牌吗?它说“form_authenticity_令牌生成有效的身份验证令牌。这在Rails不会自动添加它的地方很有用,比如在自定义Ajax调用中。”我想我可以重新使用在
csrf令牌
属性中生成的令牌。当我从
类型切换到
类型时:“post”
:“get
没有问题。从get vs post开始,get请求未验证伪造保护。好的,实际上您可以在用户会话中使用相同的csrf令牌内容。除非您使用的是Rails 5 per_form_csrf_令牌,否则所有操作(包括Ajax调用)都应该使用相同的令牌。关于此主题的其他问答大多涉及兑现问题,即代币被缓存(例如,属于其他用户)。您是否能够使用给定的令牌手动向服务器提交post请求以进行验证?作为一种难以调试的方法,您可以1)使用-例如,like中的代码对令牌进行编码,然后2)调试服务器代码以找出会话[:_csrf_token]值并手动比较以防万一,您确定可以从外部获取csrf令牌并使用它,而不是为您的请求生成一个新令牌吗?它说“form_authenticity_令牌生成有效的身份验证令牌。这在Rails不会自动添加它的地方很有用,比如在自定义Ajax调用中。”我想我可以重新使用在
csrf令牌
属性中生成的令牌。当我从
类型切换到
类型时:“post”
:“get
没有问题。从get vs post开始,get请求未验证伪造保护。好的,实际上您可以在用户会话中使用相同的csrf令牌内容。除非您使用的是Rails 5 per_form_csrf_令牌,否则所有操作(包括Ajax调用)都应该使用相同的令牌。关于此主题的其他问答大多涉及兑现问题,即代币被缓存(例如,属于其他用户)。您是否能够使用给定的令牌手动向服务器提交post请求以进行验证?作为一种难以调试的方法,您可以1)使用-例如,like中的代码对令牌进行编码,然后2)调试服务器代码以找出会话[:\u csrf\u token]值并手动比较