gpt4 book ai didi

ruby-on-rails - "WARNING: Can' t 验证 CSRF token 真实性”错误 - 带有设计和 :token_authenticatable 的 CORS

转载 作者:行者123 更新时间:2023-12-03 17:33:51 24 4
gpt4 key购买 nike

我有一个使用 CORS 对另一个域进行身份验证的单页应用程序。所有请求都是 JSON 请求。

我的应用程序可以通过身份验证,并且可以使 GET 请求正常。身份验证使用 token_authenticable。 IE。所有请求附加 '?auth_token=whatever'

所以,我的实际问题是,当我尝试执行 PUT 请求时,我得到了 警告:无法验证 CSRF token 的真实性 rails 日志中的消息以及 CanCan::AccessDenied(您无权访问此页面。)异常(exception)。

只需添加 skip_before_filter :verify_authenticity_token到 rails Controller 解决了这个问题。

因此,我只能得出结论,我的 ajax 请求正在发送无效或空的 csrf_token。

我真的不明白这是怎么回事,因为我相信我在每个 ajax 请求中都正确地发送了 X-CSRF-Token header 。

基本上,我的应用程序进行身份验证并且设计发回一个 auth_token 和一个 csrf_token:

render :status => 200, :json => {
:auth_token => @user.authentication_token,
:csrf_token => form_authenticity_token
}

然后我将这些 token 存储在我的 ajax 应用程序中,并使用 ajaxSend在 jQuery 中,设置它以便 jQuery 在每个请求中传递这些 token :
initialize: ->
@bindTo $(document), 'ajaxSend', @appendTokensToRequest

appendTokensToRequest: (event, jqXHR, options) ->
if not @authToken? then return

if @csrfToken?
jqXHR.setRequestHeader 'X-CSRF-Token', @csrfToken

if options.type is 'POST'
options.data = options.data + (if options.data.match(/\=/) then '&' else '') +
$.param auth_token:@authToken
else
options.url = options.url + (if options.url.match(/\?/) then '&' else '?') +
$.param auth_token:@authToken

然后我可以在 chrome 网络选项卡中看到,对于每个 GET 请求, auth_token正在发送参数,以及 X-CSRF-Token标题。

然而,在 PUT 请求上,它似乎不起作用。

我的理论是 CORS 把事情搞砸了。如果您发出 CORS 请求,您的浏览器实际上会发出 附加 OPTIONS 请求首先只是为了检查您是否有权访问此资源。

我怀疑是 OPTIONS 请求没有传递 X-CSRF-Token header ,因此 rails 立即使 rails 端的 csrf_token 无效。然后当 jQuery 发出实际的 PUT 请求时,它传递的 csrf_token 不再有效。

这可能是问题吗?

我能做些什么来证明这一点? Chrome 似乎没有向我显示网络选项卡中的 OPTIONS 请求来帮助我调试问题。

这不是一个大问题,因为我可以关闭 CSRF 的东西。但我想知道为什么它不起作用。

最佳答案

我认为您需要处理 OPTIONS 请求,该请求应使用允许 CORS 请求的各种 header 进行响应,IIRC 它们是 access-control-allow-method、access-control-allow-origin 和 access-control-允许标题。因为 OPTIONS 请求失败,所以可能没有发生 PUT 请求。

关于ruby-on-rails - "WARNING: Can' t 验证 CSRF token 真实性”错误 - 带有设计和 :token_authenticatable 的 CORS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13043444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com