41

我有一个正在访问节点 API 的 Angular 应用程序。我们的后端开发人员已经在 API 上实现了基本的身份验证,我需要在我的请求中发送一个身份验证标头。

我已经追踪到:

$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'}})})

但没有任何效果。如何解决这个问题?

4

8 回答 8

33

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

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

因此,请使用以下任一方法:

app.run(['$http', function($http) {
    $http.defaults.headers.common['Authorization'] = /* ... */;
}]);
app.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common['Authorization'] = /* ... */;
}])
于 2014-03-19T21:05:36.027 回答
14

我有一个服务工厂,它有一个像这样的角度请求拦截器:

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

然后在登录我的登录控制器时,我使用以下行存储访问令牌:

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

通过这种方式,我可以在我登录后发出的每个请求上将标头分配给请求。这正是我这样做的方式,完全值得批评,但它似乎工作得很好。

于 2014-06-09T18:53:53.560 回答
13

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

.controller('Controller Name', ['$http', function($http) {
   $http.defaults.headers.common['Authorization'] = 'Basic ' + login + ':' + password;
}]);
于 2013-09-18T18:43:22.157 回答
6

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

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

我在带有 ASP.NET 5 服务器的 angularjs 客户端中使用这种结构,它可以工作。

于 2016-04-20T18:40:35.967 回答
4

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

.config(['$httpProvider', function($httpProvider) {
    $httpProvider.defaults.headers.common['Authorization'] = 'Basic auth';
}]);
于 2013-09-18T18:35:56.003 回答
2

工作示例:我从@MrZime 学到了这一点 - 谢谢!并阅读https://docs.angularjs.org/api/ng/service/ $http#setting-http-headers

截至 2018 年 3 月 2 日 NGULARJS 的最新 v1.6.x

        var req = {
            method: 'POST',
            url: 'https://api.losant.com/applications/43fdsf5dfa5fcfe832ree/data/last-value-query',
            headers: {
                'Authorization': 'Bearer ' + 'adsadsdsdYXBpVG9rZW4iLCJzrdfiaWF0IjoxNdfsereOiJZ2V0c3RfdLmlvInfdfeweweFQI-dfdffwewdf34ee0',
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            data: {
                "deviceIds": [
                    "a6fdgdfd5dfqaadsdd5",
                    "azcxd7d0ghghghghd832"
                ],
                "attribute": "humidity"
            }
        }




        $http(req).then(function successCallback(response) {

            $log.log("OK!")
             returnedData = response.data

        }, function errorCallback(response) {

            if (response.status = 401) { // If you have set 401

                $log.log("BAD 401")

            }
            else {

                $log.log("broken at last")

            }
        });

将其添加到 your.js 文件中,并将此 your.js 包含在 your.html 文件中,然后在 chrome 上的 debug/F12 中查看控制台面板,您应该会获得 OK 状态,并且“returnedData”最终是您想要的。享受数据!

于 2018-03-02T21:23:08.400 回答
1

aap.run在您的方法中添加以下行

$http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w';
于 2019-08-13T11:39:49.930 回答
1

在将其附加到“基本”之前尝试对您的用户:密码进行 base64 编码,如下所示:

headers: {
  'Authorization': "Basic " + auth64EncodedUserColonPass
}
于 2016-12-07T14:48:40.670 回答