如何在http请求中发送CSRF和令牌数据?
我使用Angular将json数据发布到Drupal服务端点,但我遇到了问题。
// drupal post node
$scope.post_node = function(){
console.info('Node post ...');
var promise = $http.post('http://mysite/QuestionsGenerator/angularjs-headless/api/v1/node',
{
"title" : "Node Test",
"body" : "Node body contents test#2",
"type" : "page"
},
{
'Content-type' : 'application/json',
'Accept' : 'application/json',
'X-CSRF-Token' : $cookieStore.get('user_session_token'),
'Cookie' : $cookieStore.get('user_session_cookie')
}
)
.then(
// successCallback,
function(response){
console.log('Post-node working ...');
$log.info(response);
},
// errorCallback
function(response){
console.log('Post-node NOT working ...');
$log.error(response);
}
);
return promise;
}
}]);
使用上面的代码,我试图发布到Drupal服务端点以创建一个节点 - 所以我必须发布一个标题, body 和节点类型为新节点。
此外,我必须发布 X-CSRF-Token 和 Cookie 信息,这些信息使用Drupal对我的Angular用户进行身份验证,以便可以成功创建节点。
但是,我收到以下错误:Refused to set unsafe header "Cookie"
后跟一条消息,说明用户未登录 - 我可以确认该用户不仅存在,而且已登录。
我的网络标签显示我的令牌或Cookie详情未开始发送的详细信息 - 这可以解释用户未开始验证。
如何发送我的Cookie和令牌数据?
更新
我尝试添加 withcredentials 行,如下面的代码所示:
var headlessQS = angular.module('headlessQS', ['ngRoute', 'ngCookies']);
headlessQS.config(function($routeProvider, $httpProvider){
$routeProvider
$httpProvider.defaults.withCredentials = true
.when('/', {
templateUrl: 'pages/main.html',
controller: 'mainController'
})
.when('/wiris', {
templateUrl: 'pages/wiris.html',
controller: 'wirisController'
})
.when('/signin', {
templateUrl: 'pages/signin.html',
controller: 'signinController'
})
});
// Controllers
......
但是,我收到以下错误:
Uncaught Error: [$injector:modulerr] http://errors.angularjs.org/1.3.0-rc.2/$injector/modulerr?p0=headlessQS&p1=…
此外,当withcredentials代码确实有效时,我是否可以添加我的令牌等数据,如下面的代码所示:
var promise = $http.post('http://mysite/QuestionsGenerator/angularjs-headless/api/v1/node',
{
"title" : "Node Test",
"body" : "Node body contents test#2",
"type" : "page"
},
{
headers: {
'Content-type' : 'application/json',
'Accept' : 'application/json',
'X-CSRF-Token' : $cookieStore.get('user_session_token'),
'Cookie' : $cookieStore.get('user_session_cookie')
}
}
)
.then(
// successCallback
答案 0 :(得分:0)
如果您使用$cookies
,则设置:
$httpProvider.defaults.withCredentials = true; // from main module
然后,您的Cookie应该在每次请求时发送。
默认情况下,$http
还会从XSRF-TOKEN
Cookie中读取令牌,并在请求中应用X-XSRF-TOKEN
标头。
如果您尝试在Authorization标头上发送JWT令牌作为承载令牌,请查看使用HTTP拦截器:
// register the interceptor as a service
$provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
return {
'request': function(config) {
var access_token = tokenService.getAccessToken();
if (access_token) {
if (config.url.indexOf(this.myAPIUrl) === 0) {
config.headers.Authorization = 'Bearer ' + access_token;
}
}
return config;
}
};
});
$httpProvider.interceptors.push('myHttpInterceptor');
注意:您还可以使用HTTP拦截器捕获所有HTTP响应以及HTTP请求和响应的错误。