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

Posted

技术标签:

【中文标题】AngularJS 不发送授权或任何额外的键/值标头【英文标题】:AngularJS not sending Authorization or any extra key/value header 【发布时间】:2017-09-09 12:47:27 【问题描述】:

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

我的角码

用于设置授权令牌 -

$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);
            
        ;
]);

这是我的 HTTP 请求

$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);
    );

这是我的 NodeJS 控制器

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");
        
    );

这是我的 Node 控制台,看到没有我需要的标头 --

 
host: 'localhost:8080',
connection: 'keep-alive',
'access-control-request-method': 'GET',
origin: 'http://localhost:440',
'user-agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/57.0.2987.133 Safari/537.36',
'access-control-request-headers': 'authorization,key',
accept: '*/*',
referer: 'http://localhost:440/vokal/'

【问题讨论】:

【参考方案1】:

根据您的代码,您似乎应该没有任何问题。理想情况下,您在 Angular 中所做的事情应该为您提供自定义标题

$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 ));
);

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

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

希望这会有所帮助。

【讨论】:

问题是当我在 Express 应用程序中获取标题时,请检查我的问题 access-control-request-headers: 'authorization,key' 但我的 req.headers.authorization 和 req.headers.key 都未定义。我的意思是如何访问值? 如果您在 req.headers 上进行打印,那么您会得到什么价值? 我问题中的最后一个代码块是console.log(req.headers) 对不起,我一定错过了。您是否尝试复制我给出的相同标题。我尝试了同样的事情,但我无法重现这个错误。另外,请尝试更新您的 authorization,因为它区分大小写。

以上是关于AngularJS 不发送授权或任何额外的键/值标头的主要内容,如果未能解决你的问题,请参考以下文章

CORS AngularJS 不使用 POST 或 DELETE 发送 Cookie/凭据,但 GET OK

我应该如何发送额外的授权 ID?

如何使用 angularjs 在 RESTful 请求中执行授权?

是否可以使用 AngularJS $formatters 添加额外的零? (或以任何可能的方式,输入数字?)

带有授权标头的 AngularJS CORS

JavaScript - 使用扩展操作或替代方法向对象添加额外的键值