Вход в базу данных Parse.com с использованием API возвращает ошибку заголовка XMLHttpRequest

Вот вызов, который я делаю API Parse.com для входа пользователя:

var deferred = $q.defer();
$http({
    method: "GET",
    url: "https://api.parse.com/1/login",
    headers: {
        "X-Parse-Application-Id": PARSE_CREDENTIALS.APP_ID,
        "X-Parse-REST-API-Key": PARSE_CREDENTIALS.REST_API_KEY,
        "Content-Type": "application/json"
    },
    data: {
        "username": credentials.username.toLowerCase(),
        "password": credentials.password
    }
}).success(function(data) {
    deferred.resolve(data);
}).error(function() {
    deferred.reject("error")
});
return deferred.promise;

Когда я запускаю этот метод службы Angular, я получаю следующую ошибку в своей консоли:

XMLHttpRequest cannot load https://api.parse.com/1/login. Request header field Access-Control-Allow-Headers is not allowed by Access-Control-Allow-Headers.

Я не уверен, как это решить. Вот текущее содержимое объекта общих заголовков для моего приложения Angular:

Object {Accept: "application/json, text/plain, */*", Access-Control-Allow-Headers: "origin, content-type, accept"}

Я реализую службу $http почти точно так же для своих пользовательских классов без ошибок. Единственная разница — это URL-адрес. Может ли кто-нибудь дать ответ, почему я получаю эту ошибку?

EDIT: Из это другой вопрос, я понял, что ошибка в поле заголовка является результатом заголовка в ответе Parse.com, а не в моем запросе. Но я не уверен, как действовать сейчас.

EDIT 2: Прикрепленное изображение заголовков HTTP-запроса и ответа, которые я получаю, когда я проверяю URL-адрес API входа в систему.

введите здесь описание изображения


person Caleb Faruki    schedule 02.06.2015    source источник


Ответы (2)


Вы устанавливаете эти заголовки для всех HTTP-запросов где-то в своем угловом приложении?

Я не уверен, как это решить. Вот текущее содержимое объекта общих заголовков для моего приложения Angular:

Object {Accept: "application/json, text/plain, */*", Access-Control-Allow-Headers: "origin,

Они должны исходить только от сервера (заголовки ответов), поэтому, если они устанавливаются где-то в запросе, сервер выдаст ошибку из-за дополнительных заголовков, которых он не ожидал.

person Austin Greco    schedule 02.06.2015
comment
Вы имеете в виду перехватчик? Если так, то нет. - person Caleb Faruki; 03.06.2015
comment
хм, вы можете проверить заголовки запроса и посмотреть, есть ли там что-то, чего не должно быть? действительно звучит так, будто есть некоторые заголовки запросов, которых там быть не должно - person Austin Greco; 03.06.2015
comment
Я сам добавил свойство Access-Control-Allow-Headers. Это было предложено в другом вопросе. - person Caleb Faruki; 03.06.2015
comment
Можете ли вы попробовать удалить любые дополнительные заголовки, которые не нужны для синтаксического анализа. Вот успешный ответ, который я пробовал i.stack.imgur.com/hDGxu.png - person Austin Greco; 03.06.2015
comment
Удаление лишних заголовков не помогло. Я получил код состояния 200, так как у меня были правильные учетные данные для входа. Но ошибка XMLHttpRequest остается прежней. - person Caleb Faruki; 03.06.2015

Итак, вот соответствующая часть документации от AngularJS об использовании зависимости $http .

params – {Object.<string|Object>} – Map of strings or objects which will be turned to ?key1=value1&key2=value2 after the url. If the value is not a string, it will be JSONified.
data – {string|Object} – Data to be sent as the request message data.

Поэтому я объединил параметры с данными. Parse.com ожидает параметризованную URL-адресом строку имени пользователя и пароля . Мое замешательство было отчасти потому, что я думал, что существует несоответствие заголовков запроса и ответа. Но это было не так.

var deferred = $q.defer();
$http({
    url: "https://api.parse.com/1/login",
    headers: {
        "X-Parse-Application-Id": PARSE_CREDENTIALS.APP_ID,
        "X-Parse-REST-API-Key": PARSE_CREDENTIALS.REST_API_KEY,
        "Content-Type": "application/json; charset=utf-8"
    },
    params: {
        "username": credentials.username.toLowerCase(),
        "password": credentials.password
    }
}).success(function(data, status, headers, config) {
    deferred.resolve(data);
}).error(function(data, status, headers, config) {
    deferred.reject("error")
});

Дополнительное примечание. Всем разработчикам Angular, которые обеспокоены безопасностью учетных данных пользователей, вам необходимо настроить SSL для своего сайта, чтобы гарантировать, что эти данные не станут жертвой man-in-the-middle атаки. Для получения информации о том, как настроить SSL с Parse.com, прочитать эту статью.

Если вы не хотите платить за SSL-сертификат, как предписывает DigiCert (например, это приложение не для клиентов, а для внутренних целей), ознакомьтесь с этой статьей, чтобы узнать, как создать собственный сертификат SSL и сэкономить +100 долларов в год.

person Caleb Faruki    schedule 03.06.2015