Spring CSRF提取(POST)失败(客户端:react-native / Javascript)

时间:2018-08-22 07:14:50

标签: javascript spring-boot react-native fetch

我会在这里阅读一些建议。不幸的是,这些建议无法解决我的问题。 GET数据没有问题,但是POST数据不起作用。 尝试提取数据后返回403-禁止。 在Spring Boot中的configure-method中禁用CSRF时...

http.csrf().disable();

...一切正常。但这不是我要寻找的解决方案。

    fetch('http://IP:PORT/path', {
        method: 'POST',
        headers: new Headers({
            'Accept': 'application/json',
            'Content-Type': 'application/json'
        }),
        body: JSON.stringify(myBody),
        credentials: 'same-origin'
    }).then(response => response.json())
    .then(response => console.log(response))

    .catch(error=>
        console.log(error)
    );

凭据:“相同来源”或“包含”都无助于解决问题。我希望在这里找到帮助,否则我必须禁用csrf:/

1 个答案:

答案 0 :(得分:0)

我找到了article that solves the problem。应该可以使用Laravel(PHP)来解决同一问题,但可以轻松地对其进行修改。

您需要做的是在页面上包含带有CSRF令牌的元标记 像这样:

<meta name="_csrf" content="${_csrf.token}" />

然后在发布数据时将其包括在标题中 像这样:

    let token = document.querySelector("meta[name='_csrf']").content;
    fetch('http://IP:PORT/path', {
        method: 'POST',
        headers: new Headers({
            'X-CSRF-TOKEN': token,
            'Accept': 'application/json',
            'Content-Type': 'application/json'
        }),
        body: JSON.stringify(myBody),
        credentials: 'same-origin'
    })... rest of your code ...

通过这种方式,您将令牌发送到控制器,因此,您基本上没有问题,因为您的工作基本上与提交“正常”表单相同。