当前位置: 首页 > 知识库问答 >
问题:

Symfony 3,"ajax请求"与读取API和CSRF

南门飞扬
2023-03-14

在twig中,我生成一个csrf令牌({{csrf\u令牌('my\u intention')}})。

在Javascript中,我使用ajax调用控制器,实际上是使用fetchapi(也尝试了ajaxxmlhttprequest)、POST请求。包含请求中传递的令牌的参数名称为“token=abcdef…”。

阿贾克斯:

    var httpRequest = new XMLHttpRequest();
    httpRequest.onreadystatechange = function (data) {
        console.log(data);
    };

    httpRequest.open('POST', el.getAttribute("data-url"));
    httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    httpRequest.send(.......);

获取API:

        fetch(el.getAttribute('data-url'), {
            method: 'post',
            headers: {
                "Content-type": "application/x-www-form-urlencoded; charset=UTF-8"
            },
            body: 'token=' + encodeURIComponent(el.getAttribute('data-token'))
        }).then(data => data.text()).then(data => {...}

在名为的控制器操作中,我从POST请求中获取作为数据发送的令牌。我在控制器中检查令牌,如下所示:

    $token = $request->request->get('token');
    if (!$this->isCsrfTokenValid('my_intention', $token)) {
        throw new InvalidCsrfTokenException("error csrf 2");
    }

但是Symfony说令牌无效。

我不确定,但我认为令牌在会话变量中找不到。在isTokenValid()$this-

在浏览器中,如果我直接调用网址,就可以了。

在twig中,我设置url以调用如下数据属性dataURL=“{{path(''u check',{'id':transaction.id}}}}”,然后我从javascript读取此数据属性并将其传递给ajax/fetch函数。

我用jQuery$尝试了ajax。post(…有效。唯一的区别是请求头中的Cookie:PHPSESSID…与原始代码中的jQuery不同。

我不明白,我的代码怎么了?

Symfony 3.1。3.

编辑:解决:我没有在标题请求中传递凭据,因此,Symfony无法找到会话并检查令牌:

    fetch(el.getAttribute('data-url'), {
        method: 'post',
        headers: {
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "X-Requested-With": "XMLHttpRequest"
        },
        body: 'token=' + el.getAttribute('data-token'),
        credentials: 'include'
    }).then(data => data.text()).then(data => {

共有1个答案

柯唯
2023-03-14

即使你找到了问题的答案,我建议你看看这个包,它处理基于服务器端定义的Cookie的令牌验证,你应该传递每个异步请求。

https://github.com/dunglas/DunglasAngularCsrfBundle

 类似资料:
  • 问题内容: 我在Ubuntu16.04上将Symfony3与PhpStorm.2016.3.2一起使用 我之前从未做过AJAX请求,并且想测试从view->到controller->的控制器调用,该调用将答案发送回JSON中的视图。 所以我读了文档,但它们都很具体。因此,我的愿望是只能在视图中编写一个简单的AJAX请求,以便对其进行测试,调用控制器并在视图中返回答案。 这是我的看法: 我的控制器:

  • 问题内容: 注意 :我粘贴的代码不仅仅是ajax调用,以免代码是(导致)问题的一部分。但是,我认为并不是这样,因此您最好将注意力集中在和功能上。 还要注意,由于对此问题有一个评论(带有否决权),说我的代码很难解密,所以我很乐意澄清需要澄清的内容,如果这可以证明是找到问题的关键。 谢谢。 就是这个 我正在尝试抛弃jQuery,因为我唯一使用的是方法,而包括jQuery之类的整个库仅具有一项功能就令I

  • 我正在发送一些字符串,例如: via放心 不幸的是,API返回500。我通过邮递员发送相同的请求,它工作得很好。唯一的区别是“assings”部分。邮递员请求后,看起来像: 当“放心”请求后,它是空的: 添加了所有标头,我尝试将其作为从.json文件解析的字符串发送。一切都给出相同的结果。有人知道问题出在哪里?

  • 问题内容: 我想知道如何一次获取多个GET URL,然后将获取的JSON数据放入我的React DOM元素中。 这是我的代码: 但是,我想从服务器中获取其他JSON数据,然后使用传递到其中的所有这些JSON数据呈现我的ReactDOM。例如: 这可能吗?如果不是,将多个JSON数据提取到我的渲染ReactDOM元素中的其他解决方案是什么? 问题答案: 您可以在解决方案之前依靠Promises来执行

  • 只是为了学习目的,我使用处理程序将所有超文本传输协议请求记录到我的Web API 2应用程序。 这只是打印请求标头如下: 但是我也在POST正文中发送一个json对象,它没有打印。我想打印标题和正文。此外,我在调试时找不到任何东西在'HttpquiestMessage'对象。

  • 购买了一款产品,使我们的用户能够通过HTTP发送/接收SMS。现在,我的工作是将其构建到我们当前的CMS平台中 以下是我试图发送的特定POST请求的文档:POST:发送SMS消息 这是我的简单python程序来测试功能。我得到一个通用的500内部服务器错误响应。我做错了什么?