AngularJS中的$ http Auth头文件

我有一个angular色应用程序正在击中节点API。 我们的后端开发者已经在API上实现了基本的身份validation,我需要在我的请求中发送一个auth头文件。

我已经查明:

$http.defaults.headers.common['Authorization'] = 'Basic ' + login + ':' + password); 

我试过了:

 .config(['$http', function($http) { $http.defaults.headers.common['Authorization'] = 'Basic ' + login + ':' + password); }]) 

以及直接附加到请求:

 $http({method: 'GET', url: url, headers: {'Authorization': 'Basic auth'}})}) 

但没有任何工作。 如何解决这个问题?

你在混合用例; 实例化的服务( $http )不能在configuration阶段使用,而提供者不能在运行块中工作。 从模块文档 :

  • configuration块 – […]只有提供者和常量可以注入到configuration块中。 这是为了防止在完全configuration之前意外地实例化服务。
  • 运行块 – […]只有实例和常量可以注入运行块。 这是为了防止应用程序运行时进一步的系统configuration。

因此请使用以下任一项:

 app.run(['$http', function($http) { $http.defaults.headers.common['Authorization'] = /* ... */; }]); 
 app.config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.headers.common['Authorization'] = /* ... */; }]) 

我有一个服务工厂有一个angular度请求拦截器,如下所示:

 var module = angular.module('MyAuthServices', ['ngResource']); module .factory('MyAuth', function () { return { accessTokenId: null }; }) .config(function ($httpProvider) { $httpProvider.interceptors.push('MyAuthRequestInterceptor'); }) .factory('MyAuthRequestInterceptor', [ '$q', '$location', 'MyAuth', function ($q, $location, MyAuth) { return { 'request': function (config) { if (sessionStorage.getItem('accessToken')) { console.log("token["+window.localStorage.getItem('accessToken')+"], config.headers: ", config.headers); config.headers.authorization = sessionStorage.getItem('accessToken'); } return config || $q.when(config); } , responseError: function(rejection) { console.log("Found responseError: ", rejection); if (rejection.status == 401) { console.log("Access denied (error 401), please login again"); //$location.nextAfterLogin = $location.path(); $location.path('/init/login'); } return $q.reject(rejection); } } }]); 

然后在我的login控制器login,我使用这一行存储accesstoken:

 sessionStorage.setItem('currentUserId', $scope.loginResult.user.id); sessionStorage.setItem('accessToken', $scope.loginResult.id); sessionStorage.setItem('user', JSON.stringify($scope.loginResult.user)); sessionStorage.setItem('userRoles', JSON.stringify($scope.loginResult.roles)); 

通过这种方式,我可以在login后的每个请求中为请求分配标头。这只是我做这件事的方式,完全是为了批评,但它似乎工作得很好。

您可以在控制器中使用它:

 .controller('Controller Name', ['$http', function($http) { $http.defaults.headers.common['Authorization'] = 'Basic ' + login + ':' + password; }]); 

在$ http文档中,您可以看到您应该使用$ httpProvider设置默认标题:

 .config(['$httpProvider', function($httpProvider) { $httpProvider.defaults.headers.common['Authorization'] = 'Basic auth'; }]); 

在angularjs文档中,您可以看到一些设置标题的方法,但是我认为这是您正在search的内容:

 $http({ method: 'POST', url: '/theUrl', headers: { 'Authorization': 'Bearer ' + 'token' //or //'Authorization': 'Basic ' + 'token' }, data: someData }).then(function successCallback(response) { $log.log("OK") }, function errorCallback(response) { if(response.status = 401){ // If you have set 401 $log.log("ohohoh") } }); 

我在我的angularjs客户端使用这个结构与ASP.NET 5服务器,它的工作原理。

尝试base64编码您的用户:密码,然后再将其附加到“基本”,如下所示:

 headers: { 'Authorization': "Basic " + auth64EncodedUserColonPass }