Угловая репликация $http.get cURL

У меня проблемы с запросом angular $http.get и параметром заголовка. Я пытаюсь воспроизвести этот cURL

curl -X GET --header "Accept: application/json" --header "authenticationkey: somerandomtoken" "http://external.domain.com/admin/"

Что дает мне ответ, который я хочу.

В угловом:

var urlBase = "//external.domain.com/admin/";
var config = {
    headers:{
        'Accept'           : 'application/json',
        'authenticationkey': 'somerandomtoken'
     }
};
dataFactory.getToken = function () {
    return $http.get(urlBase,config);
};

И я получаю это сообщение об ошибке:

XMLHttpRequest cannot load http://external.domain.com/admin/. Request header field authenticationkey is not allowed by Access-Control-Allow-Headers in preflight response.

Это сводит меня с ума. Также попробовал это, https://stackoverflow.com/questions/29944997/angularjs-http-custom-header-for-all-requests, и он дает мне ту же ошибку. Любые идеи?


person henrik123    schedule 16.03.2016    source источник
comment
Простая проблема с настройками CORS на удаленном сервере, не позволяющая заголовку. Вы ничего не можете с этим поделать, если вы не контролируете другой домен. Используйте прокси на собственном сервере   -  person charlietfl    schedule 17.03.2016
comment
Серверный API должен иметь возможность принимать предварительные запросы (OPTIONS) со всеми теми же заголовками, что и обычный запрос. Вы не столкнетесь с этой проблемой с curl, потому что он не ограничен политикой одного и того же происхождения в JavaScript.   -  person Phil    schedule 17.03.2016
comment
Спасибо @charlietfl. Я не контролирую домен, мне придется уведомить администратора бэкэнда.   -  person henrik123    schedule 17.03.2016
comment
Спасибо за подробный ответ @Phil   -  person henrik123    schedule 17.03.2016


Ответы (1)


Это проблема CORS. Это происходит, если сервер приложений и домены API не совпадают.

Решение для этого может -

  1. Разрешить запрос домена из другого источника на вашем сервере API. Но это приведет к тому, что всем будет разрешен доступ к использованию ваших API. Так что подумайте и об этом. Вы также можете ограничить определенный домен на стороне вашего сервера.
  2. Если вам это нужно только для целей разработки, и ваш окончательный пакет будет выпущен только в том же домене, используйте этот плагин в Chrome https://chrome.google.com/webstore/detail/allow-control-allow.-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en, что позволит доступ к таким ресурсам во временных целях.
  3. Третий вариант — разместить эти библиотеки API JS на сервере API вашего домена, аналогично API Facebook и Google. API JS будет работать как мост между обеими сторонами.
person Ashvin777    schedule 14.08.2017