41

ノード API をヒットしている角度のあるアプリケーションがあります。バックエンド開発者は 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

次のような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);
            }
        }
    }]);

次に、ログインコントローラーにログインすると、次の行を使用してアクセストークンを保存します。

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 に答える
1

aap.runメソッドに以下の行を追加します

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