Angular http.post头问题

时间:2017-03-24 15:10:16

标签: angularjs rest http post drupal-7

如何在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

1 个答案:

答案 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请求和响应的错误。