HTTP 状态 403 - 未找到预期的 CSRF 令牌

Posted

技术标签:

【中文标题】HTTP 状态 403 - 未找到预期的 CSRF 令牌【英文标题】:HTTP Status 403 - Expected CSRF token not found 【发布时间】:2015-10-21 18:57:15 【问题描述】:

我正在从 angular $http 向服务器发帖,我得到了

HTTP Status 403 - Expected CSRF token not found. 

我可以找到here 一种解决方案是禁用 CSRF,但我不确定这是我想要的。请告诉我如何解决这个问题。

我在前端使用 Angular JS,在服务器端使用 Spring MVC 4 和 Spring security 3.2。

编辑:

SecurityConfig.java

@Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .formLogin()
                .loginPage("/signin")
                .loginProcessingUrl("/signin/authenticate")
                .failureUrl("/signin?param.error=bad_credentials")
            .and()
                .logout()
                    .logoutUrl("/signout")
                    .deleteCookies("JSESSIONID")
            .and()
                .authorizeRequests()
                    .antMatchers("search/**", "/c/**","/admin/**", "/favicon.ico", "/resources/**", "/auth/**", "/signin/**", "/signup/**", "/disconnect/facebook"/*, "/**"*/).permitAll()
                    .antMatchers("/**").authenticated()
            .and()
                .rememberMe()
            .and()
                .apply(
                    new SpringSocialConfigurer());
    

Angular JS ajax 请求:

$http(
        method: 'POST',
        url: 'addCampaign',
        data: JSON.stringify(newCampaign)
    ).
    success(function (data, status, headers, config) 

        //TODO Notification to show the campaign was successfully saved
        $log.info("campaign successfully saved");
    ).error(function (data, status, headers, config) 
        $log.info("campaign could not be saved" + data + " " + status + " " + headers + " " + config);
        //TODO to show notification that the campaign could not be saved succeffsully.
    );

【问题讨论】:

您应该向我们展示您的 CRSF 的服务器端配置和客户端代码。 @RC。我已经编辑了答案以包含代码。 @codeMan 你找到解决方案了吗? @5er 是的,我找到了解决这个问题的方法。请看我的回答。 【参考方案1】:

我找到了解决这个问题的方法。

我发现spring会将以下两个属性添加到我将返回的JSP视图中

`$_csrf.token` and `$_csrf.headerName`

我正在JSPmeta 标签中收集这些属性

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

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

javascript中,我写了以下函数,

function getMetaContentByName(name, content) 
    var content = (content == null) ? 'content' : content;
    return document.querySelector("meta[name='" + name + "']").getAttribute(content);

在发送 ajax 请求时,我包含了存在的 CRFS 令牌-

        $http(
            method: 'POST',

            headers: 
                'X-CSRF-TOKEN': getMetaContentByName('_csrf');
            ,

            url: requestURL,
            data: data
        ).
        success(function (data, status, headers, config) 

            $log.info("data : " + data);


        )

【讨论】:

以上是关于HTTP 状态 403 - 未找到预期的 CSRF 令牌的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS HTTP POST 未找到预期的 CSRF 令牌

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

HTTP 状态 403 - 在请求参数上发现无效的 CSRF 令牌“null”

在 Broadleaf 项目中 HTTP 状态 403 - 在请求参数“_csrf”或标头“X-CSRF-TOKEN”上发现无效的 CSRF 令牌“null”

Django 1.9 AJAX 表单 CSRF 令牌 403 错误 - “未设置 CSRF cookie”

使用带有 Spring Security 的 Vaadin 出现 403 CSRF 令牌错误