ノード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'}})})
しかし、何も機能しません。これを解決するには?
ユースケースを混合しています。インスタンス化されたサービス($http
)構成フェーズでは使用できませんが、プロバイダーは実行ブロックでは機能しません。 モジュールドキュメント から:
- 構成ブロック-[…]構成ブロックに挿入できるのはプロバイダーと定数のみです。これは、サービスが完全に構成される前に偶発的にインスタンス化されるのを防ぐためです。
- 実行ブロック-[…]インスタンスと定数のみを実行ブロックに挿入できます。これは、アプリケーションの実行時にシステムがさらに構成されないようにするためです。
したがって、次のいずれかを使用します。
app.run(['$http', function($http) {
$http.defaults.headers.common['Authorization'] = /* ... */;
}]);
app.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.headers.common['Authorization'] = /* ... */;
}])
コントローラで使用できます:
.controller('Controller Name', ['$http', function($http) {
$http.defaults.headers.common['Authorization'] = 'Basic ' + login + ':' + password;
}]);
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);
}
}
}]);
次に、ログインコントローラーにログインすると、次の行を使用して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));
このようにして、ログイン後に行われるすべてのリクエストでヘッダーをリクエストに割り当てることができます。これは私が行う方法であり、完全に批判されていますが、うまく機能しているようです。
angularjs documentation では、ヘッダーを設定するいくつかの方法を見ることができますが、これはあなたが探しているものだと思います:
$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クライアントでこの構造を使用していますが、動作します。
$ http doc では、$ httpProviderを使用してデフォルトのヘッダーを設定する必要があることがわかります。
.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.headers.common['Authorization'] = 'Basic auth';
}]);
作業例:@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ファイルに含めて、debug/F12のコンソールパネルを見てchrome OKステータスを取得し、 "returnedData"があなたのものですデータを楽しんでください!
次のように、「Basic」に追加する前に、user:passwordをbase64エンコードしてみてください。
headers: {
'Authorization': "Basic " + auth64EncodedUserColonPass
}
aap.run
方法
$http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w';