Можно ли делать междоменные запросы в Javascript и устанавливать собственные заголовки?

Поскольку вы не можете применять пользовательские заголовки к вызовам JSONP, как Я делаю междоменные запросы и применяю пользовательские заголовки с помощью jQuery?

В основном я пытаюсь получить доступ к документам Google с помощью jQuery и мне нужно передать токен аутентификации:

var token = "my-auth-token";
$.ajax({
  url: "http://docs.google.com/feeds/documents/private/full?max-results=1&alt=json",
  dataType: 'json',
  beforeSend: function(xhr) {
    xhr.setRequestHeader("Authorization", "GoogleLogin auth=" + token);
  },
  success: function(data, textStatus, XMLHttpRequest) {
  },
  error: function(XMLHttpRequest, textStatus, errorThrown) {
  }
});

Примечание. Целью этого является полный обход прикладного уровня. Использовать ruby ​​для подключения к API данных Google очень просто, но он требует много ресурсов для анализа каналов на стороне сервера.


person Lance Pollard    schedule 18.06.2010    source источник
comment
Вы не можете по той же причине, по которой вы не можете сделать такой же запрос к myBank.com, который либо получит мою информацию, либо заблокирует мою учетную запись, любой из них очень нежелателен... и именно поэтому междоменные запросы, такие как это не разрешено.   -  person Nick Craver    schedule 19.06.2010


Ответы (3)


Вы можете использовать клиентскую библиотеку Google JavaScript для запросов к Docs API. Хотя он не поставляется с помощниками специально для Документов, его все же можно использовать с большинством API, включая Документы. См. этот сообщение в блоге от Сотрудник Google, который показывает рабочий пример.

Если вы столкнетесь с бесконечным циклом авторизации, см. этот похожий вопрос из групп Google. По сути, файлы cookie устанавливаются недостаточно быстро, поэтому, когда клиентская библиотека JavaScript проверяет, ничего не находит и перенаправляет на страницу авторизации OAuth. Решение состоит в том, чтобы либо добавить небольшую задержку перед выполнением проверки, либо использовать кнопку входа, которая инициирует авторизацию, а не делает это при загрузке страницы.

Вам также нужно будет добавить на свою страницу любое изображение, которое находится в том же домене. Его можно скрыть с помощью CSS, если он находится в DOM.

Используя пример из приведенного выше сообщения в блоге, я смог получить список своих документов только с помощью JavaScript. Вот модифицированная функция инициализации, которую я использовал, чтобы избавиться от бесконечного цикла авторизации:

function initialize() {
    var scope = 'http://docs.google.com/feeds/';

    if (google.accounts.user.checkLogin(scope)) {
        var service = new google.gdata.client.GoogleService('writely', 'DocList-App-v1.0');   
        service.getFeed(scope + 'documents/private/full/', handleFeed, handleError);  
    } else {
        var loginButton = $("<button>Click here to login</button>");
        loginButton.click(function() {
            var token = google.accounts.user.login(scope); // can ignore returned token  
        });
        $("body").append(loginButton);
    }
};  
​
person Anurag    schedule 18.06.2010
comment
Почти готово! Теперь я получаю эту ошибку при вызове service.getFeed: Uncaught Error: на этой странице требуется изображение того же домена для аутентифицированного чтения и всех записей. Любые идеи??? - person Lance Pollard; 19.06.2010
comment
@viatropos - Ты почти у цели. Поместите любое изображение на страницу, но оно должно находиться на том же домене. Например, я поместил это временное изображение на страницу и спрятал его с помощью таблиц стилей - <img src="/images/a.png" style="display: hidden" />. - person Anurag; 19.06.2010
comment
КЛАССНО! Это именно то, что я искал, большое спасибо, Анураг. - person Lance Pollard; 19.06.2010

Подумайте о том, чтобы написать некоторый код на стороне сервера, который играет за прокси, и позволить jQuery вызывать его.

person BalusC    schedule 18.06.2010
comment
Ты сможешь. Междоменный XHR поддерживается во многих новых версиях браузеров, включая IE8. - person Eli Grey; 19.06.2010
comment
@Eli - Нет, вы не можете, не так, как изначально было у OP ... дело не в его поддержке, а в полной противоположности, они активно предотвращают это в качестве безопасности мера. - person Nick Craver; 19.06.2010
comment
@Eli: я обновил ответ, чтобы удалить, что вы не можете. Буду признателен, если вы исправите минус. - person BalusC; 19.06.2010
comment
Фиксированный. @Nick: я просто отвечал на вопрос спрашивающего чем-то, что сработало бы, если бы он мог заставить Google поддержать это. - person Eli Grey; 19.06.2010

Вы можете, если внешний домен позволяет это, отправив соответствующий заголовок Access-Control-Allow-Origin. Затем просто используйте XMLHttpRequest API в браузерах, поддерживающих стандартный междоменный XHR API, и XDomainRequest в IE.

person Eli Grey    schedule 19.06.2010