使用ajax和fetch API

时间:2016-09-20 20:51:16

标签: php slim fetch-api

我已经设置了正常的CSRF等等,并且运行良好,但是当我使用whatwg-fetch api(https://github.com/github/fetch

去使用ajax时

现在一切似乎都很好,而且一切都很好。但!然后我按如下所示添加CSRF设置,它始终失败:

所以,我使用了法线,但它失败了,在标题中我得到了消息:Failed CSRF check!

        $app->add(new \Slim\Csrf\Guard);

但是我想添加自己的消息等,所以添加了以下内容,但仍然没有通过。

      $container['csrf'] = function ($c) {
          $guard = new \Slim\Csrf\Guard;
          $guard->setFailureCallable(function ($request, $response, $next) {
              $request = $request->withAttribute("csrf_status", false);
              return $next($request, $response);
          });
          return $guard;
      };

     $app->add($container->get('csrf'));

然后在我的课上我用它来检查:

      if (false === $req->getAttribute('csrf_status')) {...}else{//all ok}

但是发生的事情总是会失败。

在我的js中,我将令牌详细信息添加到请求中,如:

    fetch('/post/url',{
       method: 'POST',
       headers: {
               'X-CSRF-Token': {
                       'csrf_name':csrf_name,
                       'csrf_value':csrf_value
                   }
           },
       body: new FormData(theForm)

我查看了发布的数据等,并提交了表单数据,包括csrf值等。那么需要csrf数据是通过表单还是标题发送的?

那么如何让ajax功能与Slim CSRF一起使用,我缺少什么?

提前致谢

4 个答案:

答案 0 :(得分:1)

我也无法获取将令牌放入体内。我决定扩展该类,以便我可以修改__invoke方法。我添加了一些代码来从头文件中提取csrf。

您的依赖项中的

现在使用此类。

CLS d = std::string{"5"};  // pass a temporary std::string constructed from "5" to the constructor of CLS

using namespace std::string_literals;
CLS d = "5"s;              // "5"s is a string literal of type std::string (supported from C++14)

扩展类。

  $c['csrf'] = function ($c) {
      return new \Foo\CSRF\Guard;
  };

答案 1 :(得分:0)

经过几天的尝试并将其缩小到fetch api后,我决定回到可靠的jQuery aJax方法,这似乎已经奏效了。

似乎以下body并且new FormData()未被提取:

fetch('/post/url',{
   method: 'POST',
   body: new FormData(theForm)

因此将其改为

     $.ajax({
           url : '/url/to/post',
           type: "POST",
           data: {key:value, kay:value}

一切运作良好。

接下来要研究的问题是,在第一次ajax调用时刷新密钥,除非刷新页面,否则会阻止不再调用,但那是另一天

答案 2 :(得分:0)

在阅读其中一位创作者的博客后,我再次参与其中。所以你可以忽略我以前的答案。

使用这些标题在正文中发送csrf会通过csrf检查。

const data = {
    'csrf_name': csrf_name,
    'csrf_value': csrf_value,
  };

  fetch(apiUrl, {
    method: 'POST',
    credentials: 'include',
    body: JSON.stringify(data),
    headers: {
      'Content-Type': 'application/json, application/x-www-form-urlencoded; charset=utf-8',
    },
  }).then((response) => {
    if (response.ok) {
      return response.json();
    }
    return null;
  }).then((json) => {
    console.log(json);
  }).catch(() => {
  });

答案 3 :(得分:0)

使用fetch时,最终帮助我成功使用Slim PHP和CSRF值的是将credentials: 'include'添加到获取请求中,例如:

const body = JSON.stringify({ 
    csrf_name: csrfName.value, 
    csrf_value: csrfValue.value
    // You can add more data here
});

fetch('/some/request', {
    method: 'POST',
    body: body,
    credentials: 'include',
    headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json'
    },
}).then(...)