Использование Parse Client Key в Angular дает ошибку CORS

0

Я пытаюсь получить класс (с GET) из Parse с помощью клиентского ключа. Я смог отправить успешный запрос с помощью Advanced Rest Client для Google Chrome; Я использовал заголовки X-Parse-Application-Id и X-Parse-Client-Key.

[edit] [edit2] Заголовки ответов (полученные из инструментов разработчика Chrome Developer OPTIONS):

HTTP/1.1 200 OK

Access-Control-Allow-Headers: X-Parse-REST-API-ключ, X-Parse-Javascript-Key, X-Parse-Application-Id, X-Parse-Client-Version, X-Parse-Session-Token, X-Requested-With, X-Parse-Revocable-Session, Content-Type

Access-Control-Allow-Methods: ОПЦИИ, POST, GET, PUT, DELETE

Access-Control-Allow-Origin: *

Access-Control-Max-Age: 86400

Content-Type: application/json; кодировка = UTF-8

Дата: Вс, 29 Ноя 2015 04:23:08 GMT

Сервер: nginx/1.6.0

X-Parse-Platform: G1

X-Runtime: 0.000118

Контент-длина: 0

Подключение: сохранить жизнь

Однако попытка сделать то же самое в приложении "Угловое" дает мне следующую ошибку:

XMLHttpRequest не может загрузить https://api.parse.com/1/classes/GenResources. Поле заголовка запроса X-Parse-Client-Key не разрешено заголовками Access-Control-Allow-Headers в предполетном ответе.

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

Здесь код, который я использовал для формирования запроса GET.

var ng_portal = angular.module("ngPortal", []);
ng_portal.controller("GenResourcesCtrl", ["$http", function($http) {
  $http({
    method: "GET",
    url: PARSE_URL + "/1/classes/GenResources",
    headers: {
      "Content-Type": "application/json",
      "X-Parse-Application-Id": PARSE_APP_ID,
      "X-Parse-Client-Key": PARSE_CLIENT_KEY
    }
  }).then(
    function success(res) {
      console.log(res);
    },
    function error(res) {
      console.log(res);
    }
  );
}]);
Теги:
parse.com
cors

2 ответа

3
Лучший ответ

Вы задаете пользовательские заголовки в запросе, что вызовет запрос перед полетом (ОПЦИИ). Ответ от этого запроса должен включать заголовок, называемый "access-control-allow-headers", при этом значение представляет собой список заголовков, которые вы пытаетесь установить.

См. Https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

в частности раздел о предполетных запросах.

Я предлагаю использовать инструменты разработчика браузера, чтобы посмотреть заголовки запросов и ответов, чтобы убедиться, что они соответствуют спецификации CORS. Из сообщения об ошибке, которое вы указали, похоже, что сервер, на котором выполняется вызов перекрестного домена, который вы создаете, не поддерживает настраиваемые заголовки. Если вы видите иначе, обновите свой вопрос заголовками, и я могу предоставить дополнительную помощь.

  • 0
    Как указано в документах API по адресу parse.com/docs/rest/guide/#quick-reference-request-format , Parse поддерживает совместное использование ресурсов из разных источников, и мне удалось получить успешный ответ с данными, которые я запрашивал у него. Я обновлю оригинальный вопрос с заголовками. Заголовки ответа содержат Access-Control-Allow-Methods и Access-Control-Allow-Origin , но не тот, который вы упомянули ...
  • 1
    Отключите кэширование в инструментах разработчика Chrome, щелкните правой кнопкой мыши по перезагрузке, затем выберите, чтобы жестко очистить кэш и перезагрузить. Вы должны увидеть новый вызов OPTIONS до основного запроса на вкладке сети. Пожалуйста, уточните вопрос с заголовками этого предполетного звонка. Спасибо!
Показать ещё 1 комментарий
0

Наверное, это проблема Parse.com. После всего одного разочарованного часа я столкнулся с этой записью в Google Groups

Соответствующая цитата

Из моего тестирования этот никогда (клиентский или javascript-ключ) не работал через javascript-взаимодействия в браузере.

Я на самом деле создал ошибку Parse Bug:

https://developers.facebook.com/bugs/488204124680438

Потому что я думал, что оба этих ключа должны работать через браузер (БЕЗ ПОЛЬЗОВАНИЯ SDK).

Id предлагает прочитать чтение моей ошибки. Я по-прежнему считаю, что правильная реализация заключается в том, чтобы эти ключи могли корректно работать с запросами браузеров, потому что они работают, если вы делаете это за пределами браузера.

Но, увы, они, похоже, не понимают проблемы, или не понимают, почему отключение этого только в браузере не имеет смысла, поскольку вы можете использовать его на любой другой платформе без проблем. Просто... Не... Делать... Смысл.

Вместо этого я использовал свой JavaScript-ключ X-Parse-Javascript-Key (который, согласно документам на сегодняшний день, работает только с их SDK для JavaScript), и он отлично работает в качестве замены для замены X-Parse-Client-Key

Ещё вопросы

Сообщество Overcoder
Наверх
Меню