Вы столкнулись с протоколом совместного использования ресурсов (CORS). У Mozilla есть хорошее введение в CORS . Вы делаете XHR с несколькими источниками, и для успешного вызова вам необходимо внести небольшое изменение или обойти это, передав запрос через ваш собственный сервер.
Тем не менее, я считаю, что есть ошибка в все еще "экспериментальном" сервисе Google, и вы не сможете заставить это работать, пока они не исправят это. Кроме того, IE9 и более ранние версии не поддерживают CORS; IE10 планирует сделать это.
Метод HTTP, который не разрешен сервером, является методом OPTIONS. Что за эй? Вы указали HTTP GET, верно? Да вы сделали. Однако протокол CORS требует, чтобы браузер при определенных условиях «предварительно выполнял» запрос. Для предварительной проверки браузер отправляет запрос OPTIONS на URL-адрес, чтобы узнать, позволит ли сервер выполнить запрос GET. В этом случае ваш вызов dojo.xhrGet за вашей спиной добавляет заголовок «X-Requested-With: XMLHTTPRequest» к вашему запросу. Отправка нестандартного заголовка, такого как X-Requested-With, является одним из тех «определенных условий», которые запускают предпечатную проверку.
К счастью, вы можете подавить этот заголовок, добавив
headers:{'X-Requested-With': null},
в ваш параметр xhrArgs.
После этого вы будете отправлять действительный запрос CORS. Однако, по моему опыту только сегодня, Google не выполняет должным образом запрос CORS. Одним из параметров в консоли API Google на вкладке «Доступ к API» в разделе «Идентификатор клиента для веб-приложений» является «Происхождение JavaScript». Здесь вы указываете происхождение, например, https://example.com любой веб-страницы, которая отправит один из этих перекрестных запросов. Вот сообщение об ошибке из Chrome:
XMLHttpRequest cannot load https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token={elided}.
Origin https://example.com is not allowed by Access-Control-Allow-Origin.
Проверка заголовков ответа Google показывает, что они вообще не отправляют Access-Control-Allow-Origin.
В моем случае, поскольку я только что создал приложение несколько часов назад, возможно, Google еще не распространил информацию о «разрешенном источнике» в системе; возможно, этот звонок будет работать завтра. Или это просто ошибка в этой экспериментальной функции.
Обходной путь: у меня просто прокси-сервер nginx для запроса в Google.
location /userinfo {
proxy_pass https://www.googleapis.com/oauth2/v1/userinfo;
proxy_redirect default;
}
Затем я отправляю xhrGet в "/ userinfo" и все отлично работает.
dojo.xhrGet({
url: '/userinfo',
handleAs: 'json',
headers:{'X-Requested-With': null}, //superfluous now
content: {alt: 'json', access_token: params.access_token}
}).then(...)