API входа в Google. Hang with uncaught error. Не удалось получить родительское происхождение из хеша URL.

Я использую JavaScript-клиент Google Sign-In в течение нескольких месяцев без проблем. Но недавно, когда пользователь нажимал кнопку входа из веб-приложения, которое добавлялось на домашний экран, всплывающее окно входа просто зависало, не показывая никакого контента.

При отладке с помощью удаленной отладки на панели консоли отображается ошибка:

Uncaught Failed to get parent origin from URL hash!

произошел от 4188232449-v2-idpiframe.js: 136 (JavaScript загружен внутри библиотеки Google).

Я уверен, что это не ошибка программирования/конфигурации, поскольку одно и то же веб-приложение ранее работало в течение нескольких месяцев без проблем, и я не модифицировал ни один код.

Я попытался выполнить поиск Google для решения этой конкретной проблемы и просмотреть документацию Google на предмет любых недавних изменений в Google Sign-In API без какой-либо удачи.

Это ошибка в клиентской библиотеке JavaScript API Google, сбой недавнего обновления браузера Chrome для Android или есть какие-то изменения в использовании API, о которых я пока не знаю?

Используется библиотека https://apis.google.com/js/platform.js

Это init-параметр для gapi.auth2.init():

{
  client_id: GAPI_CID,  // defined as constant
  cookiepolicy: 'single_host_origin',
  prompt: 'select_account',
  ux_mode: 'popup',
  fetch_basic_profile: true
}

Любое понимание будет высоко ценится. Спасибо.

PS: эта проблема отличается от Uncaught Failed для получения родительского источника из хэша URL, поскольку в этом случае проблема вызвана неправильной настройкой необходимых учетных данных в консоли API Google. Если вам никогда не удавалось интегрировать поток входа в свое приложение, возможно, ответ из этого поста может вам помочь.

В противном случае, если в течение некоторого времени вы успешно интегрировали поток входа в систему, но в последнее время проблема внезапно/ошибочно появляется с появлением пустого экрана в всплывающем окне, то у вас возникла такая же проблема со мной.

Ответ 1

Я могу подтвердить, что мы испытываем те же проблемы в моей компании с недавних пор. Это кажется немного неустойчивым, а не в 100% случаев. Но для некоторых пользователей некоторое время они встречаются с пустым всплывающим окном с URL-адресом, указывающим на " https://accounts.google.com/o/oauth2/iframe ", но ничего не происходит.

Ответ 2

Не полный ответ, но это может быть разумным обходным решением для некоторых. Я обновил ux_mode чтобы использовать redirect и теперь он частично работает.

auth2 = gapi.auth2.init({
    client_id: '1234.apps.googleusercontent.com',
    scope: 'profile email',
    ux_mode: 'redirect',
    redirect_uri: 'https://blahblah.io/oauth2callback'
})

ПРИМЕЧАНИЕ. Кажется, redirect_uri требуется, в отличие от документов Google. Это не идеальная замена, но она решает "URL-адрес хеша!". ошибка

Это сообщение в блоге и Git Repo в нем также может быть полезно для тех, кто пытается использовать redirect

Ответ 3

По этой же причине мое электронное приложение сегодня провалилось. Отладка довольно много, и я думаю, что нашел причину, но не знаю, как ее решить, почему это произошло, или если это электрон или ошибка Google.

В моем электронном приложении у меня есть 2 webviews, один для основного контента и еще один для всплывающих диалоговых окон google.

Поэтому, когда Google нужно открыть аутентификацию, он генерирует этот IFRAME:

    <iframe id="ssIFrame_google" 
                sandbox="allow-scripts allow-same-origin" aria-hidden="true" 
                src="https://accounts.google.com/o/oauth2/iframe#origin=https%3A%2F%2Fxxxx.com&amp;rpcToken=dxxd318480305.4777704" 
                style="... display: none;"></iframe>

Имейте в виду, что URL имеет параметры HASH: ваше происхождение и токен.

Однако, когда на электронной стороне я захватываю событие нового окна, чтобы открыть URL-адрес сам в другом веб-просмотре, событие я получаю LACKS хеш-параметры:

event { 
  type : "new-window",
  url:"https://accounts.google.com/o/oauth2/iframe",
  .
  .
}

Так что о том, что google iframe жалуется (я отлаживал его), является именно тем, что он не может найти параметры origin и rpctoken которые должны быть в хэш-параметрах.

По какой-то причине я не понимаю (я не обновил электрон), событие new-window больше не получает полный URL-адрес.

Используя @howMuchCheeseIsTooMuchCheese ответ ниже, я изменил поток, чтобы использовать обратный вызов перенаправления, а затем сам захватил этот обратный вызов и перезапустил приложение. Это не идеально, но, по крайней мере, я могу войти в свои приложения.