AngularJS不发送授权或任何额外的键/值标头

时间:2017-04-13 11:49:56

标签: javascript angularjs node.js express jwt

我正在使用Nodejs和Angular JS处理JWT令牌。我发现$ httpProvider在每个请求上设置标头的方式。但是没有发送标题。我的NodeJS应用程序在访问该标头时未定义。

我的角度代码

  

用于设置授权令牌 -

container.RegisterType(
    typeof(IApp),
    new InjectionFactory(f => App.Create(
        container.Resolve<IOne>(), 
        container.Resolve<ITwo>())));

这是我的HTTP请求

$httpProvider.interceptors.push(['$q', '$location', '$localStorage', function($q, $location, $localStorage) {
        return {
            'request': function (config) {
                config.headers = config.headers || {};
                if ($localStorage.token){
                    console.log($localStorage.token)

                    config.headers.Authorization = 'Bearer ' + $localStorage.token;
                    console.log(config.headers);
                }
                return config;
            },
            'responseError': function(response) {
                if(response.status === 401 || response.status === 403) {
                    $location.path('#login');
                }
                return $q.reject(response);
            }
        };
}]);

这是我的NodeJS控制器

$scope.getSearcHistory = function(){
     console.log($localStorage.token);
     console.log( $rootScope.getCurrentUser());
    $http({
        url: baseUrl+'userSearches/2',
        method : 'GET',
        headers: {
            'key': '1234424252'
        }
    })
    .success(function(data, status, headers, config){
        console.log(data);
        $scope.searches = data;
    })
    .error(function(data, status, headers, config){
        console.log(status);
    });
}

这是我的节点控制台,看到我没需要标题 -

this.router.use(function(req, res, next){
        console.log(req.headers);
        var bearerToken;
        var bearerHeader = req.headers.authorization;
        console.log(bearerHeader)
        if (typeof bearerHeader !== 'undefined') {
            var bearer = bearerHeader.split(" ");
            bearerToken = bearer[1];
            req.token = bearerToken;
            next();
        } else {
            res.send(403).json({"Authorization": "Not allowed"});
        }
    });

1 个答案:

答案 0 :(得分:0)

根据您的代码,您似乎不应该有任何问题。你在角度做什么应该理想地给你自定义标题

$http({
    method: 'GET',
    url: '/api',
    headers: {
        'Authorization': 'test',
        'Accept': 'application/json',
        "X-Test-Header": 'true'
    }
}).then(function(response) {
    if (response.data == 'ok') {
        // success
    } else {
        // failed
    }
});

一旦你是否收到标题,你能否检查你的控制台。

如果这不起作用,那么您可能需要将节点设置为允许所有标题

var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
};

并在您的应用中配置

app.configure(function () {
  app.use(app.router);
  app.use(allowCrossDomain);
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

所有这些只是处理是否可以发送自定义标头。如果您正在使用auth令牌,则需要在$ http中以角度正确设置它,以便每次发出请求时都可以发送它。为此你可能想要包括

$http.defaults.headers.common['x-access-token'] = jwt

希望这有帮助。