Не отправлять заголовок авторизации из Angular в AWS
Я пытаюсь создать веб-приложение, которое должно получить предварительно подписанный URL-адрес Amazon S3, а затем загрузить файл на этот URL-адрес с помощью Knox.
Однако S3 выдает мне эту ошибку, когда я пытаюсь получить доступ к своему ведру
<Error><Code>InvalidArgument</Code><Message>Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified</Message><ArgumentName>Authorization</ArgumentName><ArgumentValue>Bearer *****bearer token*****</ArgumentValue><RequestId>1AFD8C7FD2D7E667</RequestId><HostId>ID</HostId></Error>
Я вижу, что мой запрос к Amazon содержит не только мои ключи Amazon, но и мой заголовок авторизации
https://bucket.s3-eu-west-1.amazonaws.com/image.jpg?Expires=1418226249&AWSAccessKeyId=<key>&Signature=DHYCio7Oao%2BnzPWiiWkGlHb0NAU%3D
и заголовок Авторизация: Носитель
код выглядит так
$http.post(image, data, {headers: { 'Authorization': null }, withCredentials: false} ).success(function (url) {
item.images[0] = url;
$http.post('/api/item', item);
});
Как избавиться от токена авторизации для запросов, не указывающих на мой домен?
С уважением
1 ответ
Вам следует использовать Interceptors и его определяемые как сервисные фабрики, которые зарегистрированы в $httpProvider, добавив их в массив $httpProvider.interceptors. Фабрика вызывается и вводится с зависимостями (если указано) и возвращает перехватчик.
Я предполагаю, что мой токен авторизации сохранен в cookie, и я хочу передать этот токен как заголовок авторизации. Таким образом, чтобы добиться этого, это то, что я сделал, и это работает для меня.
//Token Interceptor to intercept HTTP_AUTHORIZATION token into headers.
App.factory('TokenInterceptor', [ '$q', '$window', '$location', function ($q, $window, $location) {
return {
request: function (config) {
config.headers = config.headers || {};
if ($window.sessionStorage.token) {
config.headers.Authorization = $window.sessionStorage.token;
}
return config;
},
requestError: function(rejection) {
return $q.reject(rejection);
},
/* Set Authentication.isAuthenticated to true if 200 received */
response: function (response) {
if (response !== null && response.status === 200 && $window.sessionStorage.token && !$window.sessionStorage.isAuthenticated) {
$window.sessionStorage.isAuthenticated = true;
}
return response || $q.when(response);
},
/* Revoke client authentication if 401 is received */
responseError: function(rejection) {
if (rejection !== null && rejection.status === 401 && ($window.sessionStorage.token || $window.sessionStorage.isAuthenticated)) {
delete $window.sessionStorage.token;
$window.sessionStorage.isAuthenticated = false;
$location.path('/');
}
return $q.reject(rejection);
}
};
}]);
Как только вы напишите вышеупомянутый сервис, вы должны поместить этот перехватчик в массив $httpProvider.interceptors следующим образом
$httpProvider.interceptors.push('TokenInterceptor');
Теперь каждый раз, когда вы делаете http-запрос, этот заголовок авторизации автоматически добавляется в заголовки.
Спасибо