0

Я пытаюсь создать веб-приложение, которое должно получить предварительно подписанный URL Amazon S3, а затем загрузить файл на этот URL с помощью Knox.Не отправлять заголовок авторизации от Angular до AWS

Однако 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, но и моего Authorization Заголовок

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

Как избавиться от токена авторизации для запросов, не указывающих на мой домен?

С уважением

ответ

0

Вы должны использовать 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 этого заголовок Authorization будет автоматически добавлен в заголовки.

Thanks

+0

Благодарим за ответ. Я пытаюсь удалить заголовок для некоторых вызовов. Я не уверен, где он добавляется, если это паспорт или угловатый. –

+0

Вы можете добавить некоторые условия в определенные места в TokenInterceptor. – CrazyGeek