NetworkError: метод 405 не разрешен для получения информации о пользователе через Google Api - PullRequest
0 голосов
/ 28 ноября 2011

Я пытаюсь получить информацию о профиле пользователя, описанную здесь: http://code.google.com/intl/es-ES/apis/accounts/docs/OAuth2Login.html

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

"NetworkError: метод 405 не разрешен - https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=token"

использую протокол приложения веб-сервера для получения токена:

это мой код:

var xhrArgs = {

        url : "https://www.googleapis.com/oauth2/v1/userinfo?alt=json",
        content : {
            access_token : access_token
        },
        load : function(data) {
            console.log(data);
        },
        error : function(error) {
            console.log(error);
        }
};
dojo.xhrGet(xhrArgs);

Надеюсь, кто-нибудь может помочь, заранее спасибо

Ответы [ 2 ]

1 голос
/ 19 января 2012

Вы столкнулись с протоколом совместного использования ресурсов (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(...)
0 голосов
/ 05 декабря 2011

Похоже, вы либо не прошли аутентификацию, либо не передаете правильную информацию в access_token.Может помочь, если вы покажете, как вы получаете access_token, и дадите форму токена доступа, который вы передаете, например, 16-значный шестнадцатеричный номер.или 100 char base 64 string.

Также я не знаком с dojo, пример показывает, что добавление access_token в url, а не тело запроса с get добавляет dojo добавление содержимого в качестве параметров url?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...