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>",...}

Надеюсь, это поможет вам, ребята!