Angularjs 正在从 Spring Boot 接收 XSRF-TOKEN 但不发送 X-XSRF-TOKEN

Posted

技术标签:

【中文标题】Angularjs 正在从 Spring Boot 接收 XSRF-TOKEN 但不发送 X-XSRF-TOKEN【英文标题】:Angularjs is receiving XSRF-TOKEN from spring boot but does not sends X-XSRF-TOKEN 【发布时间】:2018-06-13 16:42:49 【问题描述】:

我已经为 CSRF 设置了 Spring Boot 1.5.x。在spring上测试一切正常:(1)服务器生成令牌并发送给客户端(2)如果客户端发送令牌一切正常。

使用 Web 客户端,我使用 Spring Boot 作为 rest API(使用 http://localhost:8088/)和 angularjs 作为客户端(使用 http://localhost:9000) 但它接缝问题出在 angularjs 上,它在标头密钥 XSRF-TOKEN 而不是 X-XSRF-TOKEN (spring 正在等待的那个)上发送令牌。

通过阅读 angularjs 文档,此标头密钥应自动发送 (https://docs.angularjs.org/api/ng/service/$http#cross-site-request-forgery-xsrf-protection)

angularjs 与 spring boot 交互的打印屏幕在哪里

(1) GET xhr 请求接收spring boot csrf token

(2) POST xhr 请求需要发送带有名字的token

在 spring 中,我使用 CORS 过滤器,并且只使用 spring 安全功能来生成 CSRF 令牌

.csrf()
    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())

在 angularjs 中,我已经尝试通过拦截器定义标题键(只是尝试解决方案)

$httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

var interceptor = ['$rootScope', '$q', 'httpBuffer', '$cookieStore', function ($rootScope, $q, httpBuffer, $cookieStore) 
    return 
        'request': function (config, a, b) 
            return config;
        ,

        'requestError': function (rejection) 
            return $q.reject(rejection);
        ,

        'response': function (response) 
            $httpProvider.defaults.headers.common['X-XSRF-TOKEN'] = response.headers('XSRF-TOKEN');
            return response;
        ,

        'responseError': function (rejection) 

            console.log('rejection', rejection.headers());

            var deferred = $q.defer();

            return $q.reject(rejection);
        
    ;
];

$httpProvider.interceptors.push(interceptor);

【问题讨论】:

【参考方案1】:

需要在响应中存储令牌并根据请求发送。如果您需要发送所有请求,请覆盖拦截器上的request 方法:

request: function (config) 
      config.headers['x-xsrf-token'] = stored_token;

      return config;
    

否则在单个 $http 请求中发送它。

【讨论】:

以上是关于Angularjs 正在从 Spring Boot 接收 XSRF-TOKEN 但不发送 X-XSRF-TOKEN的主要内容,如果未能解决你的问题,请参考以下文章

通过发布请求,spring boot 和 angularjs 之间的错误请求错误

如何从 URL、Spring Boot 和 AngularJs 应用程序中删除 #?

带有Angularjs注销错误的Spring Boot

Angularjs + Spring-boot + nginx的CORS问题

Spring Boot & Security with AngularJS 登录页面

Spring boot、maven、AngularJS 2、打字稿和实时重载