GoogleUser.getAuthResponse() не содержит access_token
UPDATE2: Я пересмотрел эту проблему и решил проблему, тщательно следуя приведенным ниже документам doco. Но во-первых, для тех, кто борется с этим, вы в хорошей компании. Существует так много версий doco от Google, что это сбивает с толку! Включите в свой html файл platform.js или client.js? Вы загружаете gapi.auth или gapi.auth2? Вы используете gapi.auth2.render или gapi.auth.authorize, или gapi.auth2.init и т.д.
Способ, которым возвращает access_token (начиная с этой даты в статье), приведен ниже. Мне удалось получить эту работу, тщательно следуя руководству и ссылке с помощью platform.js. Затем динамически загружаются другие библиотеки, такие как client.js, используя gapi.load( "диск", обратный вызов).
https://developers.google.com/identity/sign-in/web/listeners
https://developers.google.com/identity/sign-in/web/reference
==== ОРИГИНАЛЬНЫЙ ВЫПУСК ДЛЯ ПРОЦВЕТАНИЯ ====
ОБНОВЛЕНИЕ 1:
Я обновил образец кода, чтобы выполнить рекурсивный поиск объекта googleUser. По крайней мере, это не должно ломаться в последующей библиотеке.
Ниже приведен фрагмент кода для обработки проблемы, когда access_token в объекте Google gapi.auth2.AuthResponse не находится на верхнем уровне... он скрыт: (в глубине объекта!
Так что это можно восстановить, но не на верхнем уровне!!?? Я заметил, что это проблема синхронизации... Когда приложение выполняется некоторое время при последующих проверках, оно содержит токен доступа на верхнем уровне!
var authResponse = _.googleUser.getAuthResponse();
_.id_token = authResponse.id_token; // Always exists
// access_token should also be a param of authResponse
if (authResponse.access_token) {
debug("Worked this time?");
_.access_token = authResponse.access_token;
} else {
// !!! Internal object access !!!
debug("Attempt to get access token from base object.");
_.access_token = _.objRecursiveSearch("access_token", _.googleUser);
if (_.access_token) {
debug("Access token wasn't on authResponse but was on the base object, WTF?");
} else {
debug("Unable to retrieve access token.");
return false;
}
}
_.objRecursiveSearch = function(_for, _in) {
var r;
for (var p in _in) {
if (p === _for) {
return _in[p];
}
if (typeof _in[p] === 'object') {
if ((r = _.objRecursiveSearch(_for, _in[p])) !== null) {
return r;
}
}
}
return null;
}
Я предполагаю, что getAuthResponse каким-то образом обеспечивает обратный вызов, когда он готов, но я не вижу, где в API.
https://developers.google.com/identity/sign-in/web/reference
Ответы
Ответ 1
Выяснили, исправить это. Оказывается, если мы не предоставим конфигурацию области входа в gapi.auth2.init, она не вернет access_token в getAuthResponse. Пожалуйста, позвоните по адресу gapi.auth2.init, как указано ниже, и будет доступен access_token.
gapi.auth2.init({
client_id: <googleClientID>,
'scope': 'https://www.googleapis.com/auth/plus.login'
})
Ответ 2
Я знаю, что этот вопрос довольно старый, но он появляется первым, когда googling для ".getAuthResponse() не имеет access_token", - вот как я сюда попал.
Итак, для тех из вас, в 2016 году (и, возможно, позже), я узнал, что я узнал
Здесь есть секретный аргумент .getAuthResponse
, который нигде не был зарегистрирован. Если вы выполните следующее в своем приложении
console.log(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse);
Вы увидите, что вы получаете следующее (копирование/вставка с моей консоли)
function (a) {if (a) возвращает this.hg; a =.HE; var c =.rf(this.hg);! a.Ph || a.dL || a.Lg || ( удалить c.access_token, удалить c.scope); return c}
Это показывает, что функция .getAuthResponse()
ищет аргумент, и, насколько я могу судить, даже не проверяет его значение - он просто проверяет, есть ли он, а затем возвращает весь объект. Без этой функции остальная часть кода работает, и мы можем очень четко видеть, что она удаляет два ключа: access_token
и scope
.
Теперь, если мы будем называть эту функцию с аргументом и без него, мы можем проверить разницу в выходе. (примечание: я использовал JSON.stringify, потому что попытка скопировать/вставить объект из моей консоли браузера вызвала у меня некоторые проблемы).
console.log(JSON.stringify(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse()));
console.log(JSON.stringify(gapi.auth2.getAuthInstance().currentUser.get().getAuthResponse(true)));
объект getAuthResponse()
{ "Token_type": "Знаменосец", "Login_hint": "<Huge mess of letters>
", "Expires_in": 2112, "id_token": "<insert your ridiculously long string here>
",...}
объект getAuthResponse (true)
{ "Token_type": "Знаменосец", "Access_token": "<an actual access token goes here>
", "Объем": "<whatever scopes you have authorized>
", "Login_hint": "<another mess of letters>
", "Expires_in": 2112, "Id_token": "<insert your ridiculously long string here>
",...}
Надеюсь, это поможет вам, ребята!