如何在单页应用(spring security)中提供 CSRF Token?

Posted

技术标签:

【中文标题】如何在单页应用(spring security)中提供 CSRF Token?【英文标题】:How to provide the CSRF Token in single page application (spring security)? 【发布时间】:2015-03-05 15:10:00 【问题描述】:

当我尝试使用 ajax 加载页面的一部分时,出现 403 错误

在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”。

Spring Security 常见问题解答告诉我们

如果 HTTP POST 返回 HTTP 403 Forbidden,但适用于 HTTP GET 那么问题很可能与 CSRF 有关。要么提供 CSRF Token 或禁用 CSRF 保护(不推荐)。

那么,a 怎么做呢?

function getPage(url) 
    $.ajax(
        type: 'POST',
        url: url,
        data: _csrf: "??",
        success: function (data) 
            loadPage(url, data);
        
    );

【问题讨论】:

【参考方案1】:

在这里找到了我自己的问题的答案: http://spring.io/blog/2013/08/21/spring-security-3-2-0-rc1-highlights-csrf-protection/

这个 - 到 html

<meta name="_csrf" content="$_csrf.token"/>
<meta name="_csrf_header" content="$_csrf.headerName"/>

this - to js

$(function () 
    var token = $("meta[name='_csrf']").attr("content");
    var header = $("meta[name='_csrf_header']").attr("content");
    $(document).ajaxSend(function(e, xhr, options) 
        xhr.setRequestHeader(header, token);
    );
);

【讨论】:

我有一个场景,我不通过 Spring 提供单页应用程序。它由另一个 Web 服务器提供服务,它需要对我的 API 执行请求。【参考方案2】:

您可以从存储在您客户端的 cookie 中获取令牌。为此,您必须使用类似 cookie-service 的东西: https://www.npmjs.com/package/angular2-cookie

编写这样的函数来获取令牌:

getCookie()
    return this._cookieService.get("token-name");

最后将令牌添加到请求头中:

doSomething(token)
    var json = JSON.stringify();
    var headers = new Headers();
    headers.append('Content-Type','application/json');
     headers.append('token-name', token);
    return this._http.post('http://localhost:8080/doSomething', json, 
        headers: headers
    ).map(res => res.text()
    );

这解决了我的问题

【讨论】:

以上是关于如何在单页应用(spring security)中提供 CSRF Token?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AngularJS 和 Spring Security 的单页应用程序中需要 AntMatchers

Spring Security 和单页应用程序

如何在单页应用程序 (SPA) 的特定页面中隐藏对讲聊天小部件?

如何在单页应用程序中以角度将数据从一页传递到另一页

如何在单页移动 Web 应用程序中实现我自己的历史堆栈?

如何在单页应用程序 (SPA) 中实现 ReCaptcha