2015-09-23 6 views
-1

Я пытаюсь допросить службу отдыха. Если я использую CURL, я могу вернуть данные без проблем.AngularJS GET Cross Domain с базовой аутентификацией

curl -k -X GET -H "Accept: application/json" -u username:password "https://example.com/v1/apps" 

Однако, я попытался несколько методов для протяжки данных обратно с помощью угловых в $ HTTP и $ ресурсных услуг и ничто не похоже на работу.

У кого-нибудь есть хороший пример того, как это сделать с помощью Angular 1.4.6?

Это вызов по междоменной и базовой аутентификации.

Есть так много «похожих» примеров, но ничего не работает.

+1

Это, скорее всего, проблема с вашим сервером и вообще не связанная с угловым. Когда вы имеете дело с CORS, не забывайте о предвоенных матчах. –

+0

Вопросы CORS задаются много раз в день ... не сложная тема для исследования – charlietfl

+0

Я провел лучшую половину последних двух дней, исследуя ответ на этот пример, каждый из которых я получаю. «Не трудная тема для исследования», правда. Тем не менее, я брошу вам вызов, чтобы привести пример, который работает. –

ответ

0

Надеюсь, это спасет кого-то еще от разочарования. Несколько вопросов вызывали проблему.

  • Неверный сертификат на целевом сайте. Они использовали самоподписанный сертификат с example.com как домен.
  • Звонок, который я использовал, имел в нем капитал «GET», он должен быть все в нижнем регистре.

Чтобы решить проблему 1, мне пришлось добавить IP-адрес сервера на мои хосты с помощью псевдонима example.com. Это серьезный взлом, но нужно было обойти проблему с недопустимым доменом. Я работаю с владельцами серверов, чтобы иметь правильный сертификат.

Для вызова себя, вот пример, который работает. Я использую другую службу для заголовка auth. Он просто base64s имя пользователя и пароль. Замените AuthorizationService.getCredentials() вашим любимым инструментом base64 (имя пользователя: пароль). Их несколько.

.factory( 
     'ApplicationDetailService', 
     [ 
      '$resource', 'AuthorizationService', 
      function($resource, AuthorizationService) {      
       return $resource('https://example.com/v1/apps/:id', { id: '@id' }, 
        { 
         'get' : { 
          headers: { 
           Authorization: AuthorizationService.getCredentials() 
          } 
         }        
        } 
       ); 
      } 
     ] 
    ) 

Наконец, поскольку целевой сервер не передавал заголовок Access-Control-Allow-Origin: * в своем ответе. Все современные браузеры, чтобы выровнять, отклоняют возврат AJAX.

Я был в предположении, что это была Угловая вещь, я был неправ. Там есть подключаемый модуль для Chrome, называемый Access-Control-Allow-Origin: *, я пробовал это, он провалился, потому что CORS нуждается в вашем домене в заголовке.

Я нашел флаг для хрома --disable-web-security, который сообщает Chrome игнорировать всю безопасность. FAIR WARNING: Это делает вашу сессию очень неуверенной. Делайте это только для тестовой среды. Просто измените свой ярлык, чтобы передать флаг в качестве параметра chrome.exe.

Со всем этим я смог пройти мимо моей проблемы и продолжить разработку, пока команда сервера не зафиксирует все на своем конце.

Удачи!

+0

Установка этого плагина для Chrome для изменения вашего Origin или использования '--disable-web-security' - это *** ужасные *** варианты. В тот момент, когда вы прибегаете к этим опциям, вы, по сути, обрекаете свое приложение на наличие необнаруженных недостатков безопасности. – Claies

+0

@Claies Я полностью согласен с вами. Не поймите меня неправильно. Это просто ВРЕМЕННОЕ решение для решения проблемы. Я не владею окружающей средой, с которой мне нужно поговорить, но я работаю с владельцами, чтобы решить их проблемы. К счастью, оба решения влияют только на мою среду, они не влияют на общий проект. т. е. я не взламываю свой Угловой проект. –