Ruby on rails 使用真实性令牌完成POST请求,但仍引发异常
我的控制器正在响应js GET请求,在我的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.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]值并手动比较