Rails无法使用X-CSRF-TOKEN标头验证CSRF令牌真实性ajax

lok*_*khi 2 ajax ruby-on-rails csrf

我尝试在我的数据库中注册服务工作者端点,但是当我使用fetch发送我的帖子数据时,会引发错误.

我想保留csrf验证.你看错了吗?

            var ready;

            ready = function(){
              if ('serviceWorker' in navigator) {
               console.log('Service Worker is supported');
                navigator.serviceWorker.register('/service-worker.js').then(function(reg) {

                 reg.pushManager.subscribe({
                     userVisibleOnly: true
                 }).then(function(sub) {
                     console.log('endpoint:', sub.endpoint);
                     console.log(sub);
                     var token = $('meta[name=csrf-token]').attr('content')
            console.log(token);

                     return fetch('/register_endpoint', {
                    method: 'post',
                    headers: {
                      'Content-type': 'application/json',
                      'X-CSRF-TOKEN': token
                    },
                    body: JSON.stringify({
                      endpoint: sub.endpoint,
                      authenticity_token: token

                    })
                  });
                 });


               }).catch(function(err) {
                 console.log('Erreur -> ', err);
               });
              }

            };



            $(document).ready(ready);
            $(document).on('page:load',ready);
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 10

问题是如果credentials没有将会话cookie 指定为其中的选项,则不会发送会话cookie fetch.

credentials3个可能的值:

  • omit - >不发送cookie
  • same-origin - >仅当URL与调用脚本位于同一源时才发送cookie
  • include - >始终发送cookie,即使是跨域呼叫也是如此

所以这应该可行:

return fetch('/register_endpoint', {
 method: 'post',
 headers: {
  'Content-type': 'application/json',
  'X-CSRF-TOKEN': token
  },
  body: JSON.stringify({endpoint: sub.endpoint}),
  credentials: 'same-origin'
})
Run Code Online (Sandbox Code Playgroud)

这里有关于本机fetch api的更多信息.