AngularJS:将api中的csrf令牌作为常量,使用异步数据初始化应用程序
我希望查询API以获取CSRF令牌。然后在所有HTTP请求的头中设置此令牌 在我将CSRF令牌设置为angularJS应用程序的常量之前,我遇到了一些困难AngularJS:将api中的csrf令牌作为常量,使用异步数据初始化应用程序,angularjs,http,http-headers,csrf,Angularjs,Http,Http Headers,Csrf,我希望查询API以获取CSRF令牌。然后在所有HTTP请求的头中设置此令牌 在我将CSRF令牌设置为angularJS应用程序的常量之前,我遇到了一些困难 app.run(['$http', function($http) { var csrf = $http( { method: 'GET', url: 'api/csrf' }) .success(function(data) { console.log("CSRF Succe
app.run(['$http', function($http) {
var csrf = $http( { method: 'GET', url: 'api/csrf' })
.success(function(data) {
console.log("CSRF Success: " + data.token);
return data.token;
})
.error(function(data) {
console.log("CSRF ERROR: " + data);
});
console.log("CSRF TOKEN: " + csrf);
$http.defaults.headers.common['X-Csrf-Token'] = csrf;
}]);
当我运行我的应用程序时,我在浏览器控制台中获得以下信息:
CSRF TOKEN: [object Object] scripts.js?v=1400582971:32411
GET http://testapp/api/v1/supplier 400 (Bad Request) scripts.js?v=1400582971:17571
CSRF Success: zD7TrQWQWma0eHYtzM8NcgbvitB9XJzTCegjAVMg scripts.js?v=1400582971:32404
这里有几件事不对
- 首先,
应该在CSRF成功
之前输出CSRF令牌
- 其次,
应该是CSRF令牌:[object object]
CSRF令牌:zD7TrQWQWma0eHYtzM8NcgbvitB9XJzTCegjAVMg
- 第三,400(错误请求)的原因是get请求中发送的头是
。标题应为X-Csrf-Token:[对象]
X-Csrf-Token:zD7TrQWQWma0eHYtzM8NcgbvitB9XJzTCegjAVMg
csrf
成为对象。它需要是一个实际的字符串值
一旦我完成了这项工作,我希望提取http请求,并执行如下操作:
app.factory("CSRF_TOKEN", function($http) {
var token;
$http( { method: 'GET', url: 'api/csrf' })
.success(function(data) {
console.log("CSRF Success: " + data.token);
token = data.token;
})
.error(function(data) {
console.log("CSRF ERROR: " + data);
});
});
app.run(['$http', 'CSRF_TOKEN', function($http, CSRF_TOKEN) {
$http.defaults.headers.common['X-Csrf-Token'] = CSRF_TOKEN.token;
}]);
我的问题解决方案:
var xhReq = new XMLHttpRequest();
xhReq.open("GET", "//" + window.location.hostname + "/api/csrf", false);
xhReq.send(null);
app.constant("CSRF_TOKEN", xhReq.responseText);
app.run(['$http', 'CSRF_TOKEN', function($http, CSRF_TOKEN) {
console.log("Injected CSRF: " + CSRF_TOKEN);
$http.defaults.headers.common['X-Csrf-Token'] = CSRF_TOKEN;
}]);
您的原始解决方案不起作用,因为您希望
$http.get
返回您的令牌,但实际上此方法返回承诺。实际数据(您的令牌)通过success
函数异步返回
您的原始代码可能如下所示:
$http({ method: 'GET', url: 'api/csrf' })
.success(function(response) {
var token = response.data.token;
console.log("CSRF Success: " + token);
$http.defaults.headers.common['X-Csrf-Token'] = token;
//carry on with processing
})
.error(function(response) {
console.log("CSRF ERROR: " + response.status);
});
问题解决了。。。请参阅更新的解决方案。我全神贯注于寻找更好的替代方案。