Angularjs从春季启动接收XSRF-TOKEN但不发送X-XSRF-TOKEN

问题描述 投票:0回答:1

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

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

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

哪里是angularjs与弹簧靴相互作用的打印屏幕

(1)接收spring boot csrf令牌enter image description here的GET xhr请求

(2)POST xhr请求,需要发送名为enter image description here的令牌

在春天,我使用CORS过滤器,只使用弹簧安全功能来生成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);
angularjs spring-boot csrf
1个回答
0
投票

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

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

      return config;
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.