Google 登录 API 挂起并出现未捕获的错误无法从 URL 哈希获取父源

Posted

技术标签:

【中文标题】Google 登录 API 挂起并出现未捕获的错误无法从 URL 哈希获取父源【英文标题】:Google Sign-In API Hang with uncaught error Failed to get parent origin from URL hash 【发布时间】:2019-03-13 19:36:12 【问题描述】:

我使用 Google Sign-In javascript 客户端几个月没有问题。 但是最近当用户从添加到主屏幕的 web 应用程序中点击登录按钮时,登录弹出窗口只是挂起,没有显示任何内容。

远程调试时,控制台面板显示错误:

Uncaught Failed to get parent origin from URL hash!

源自 4188232449-v2-idpiframe.js:136(由谷歌库内部加载的 javascript)。

我确定这不是编程/配置错误,因为同一个 web 应用程序之前运行了几个月都没有问题,而且我没有修改任何代码。

我已经尝试用谷歌搜索这个特定的问题,并浏览谷歌文档以了解谷歌登录 API 的任何最新更改,但没有任何运气。

是来自 Google API Javascript 客户端库的错误,是来自 android 上最近的 Chrome 浏览器更新的故障,还是 API 使用发生了一些我还不知道的变化?

使用的库是https://apis.google.com/js/platform.js

这是 gapi.auth2.init() 的初始化参数:


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

任何见解将不胜感激。谢谢。

P.S.:这个问题与 Uncaught Failed to get parent origin from URL hash 不同,因为在这种情况下,问题是由 Google API 控制台中所需凭据的错误配置引起的。 如果您从未成功地将登录流程与您的应用集成,那么该帖子中的回答或许可以帮助您。

否则,如果您已经成功集成登录流程有一段时间了,但最近突然/不规律地出现问题并在弹出窗口出现黑屏症状,比你和我有同样的问题。

【问题讨论】:

我有一个应用程序(电子)使用相同的设置一年了,今天才开始发生这种情况。谷歌一定改变了什么。 您找到解决方法了吗? 我们看到了同样的错误。我们的网站周围有一个薄的电子包装器。该错误发生在 Electron 应用程序中,但不在原版网站上。在 Electron 应用中,process.versions 包含 "electron": "2.0.9" 和 "chrome": "61.0.3163.100" 使用 Chrome 66 将 Electron 更新到最新的稳定版 3.0.3,或者使用 Chrome68 更新到 4.0.0-nightly 并没有帮助。 可能相关? ***.com/questions/52723971/… 【参考方案1】:

目前还没有一个完整的答案,但这对某些人来说可能是一个合理的解决方法。我将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 哈希!”错误

这个blog post 和其中的 Git Repo 也可能对任何尝试使用 redirect 的人有所帮助

【讨论】:

嘿,这对我有用,因为我得到了对话框,但流程不同:不是打开一个弹出窗口,而是用谷歌的身份验证替换主页,最后重定向到回调 url .不适合我的电子结构,但我也设法支持这种流动。非常感谢!【参考方案2】:

出于同样的原因,我的电子应用程序今天开始失败。调试了很多,我认为找到了原因,但不知道如何解决它,为什么会发生,或者是电子还是谷歌的错。

在我的电子应用程序中,我有 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 参数:您的来源和令牌。

但是,当我在电子端捕获新窗口事件以便自己在另一个 web 视图中打开 URL 时,我收到的事件缺少哈希参数:

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

所以 google 的 iframe 抱怨(我调试了它)正是它找不到 originrpctoken 参数应该在哈希参数中

由于我不明白的原因(我还没有更新电子)new-window 事件不再收到完整的 url。

使用下面的@howMuchCheeseIsTooMuchCheese 答案,我已将流程更改为使用重定向回调,然后自己捕获该回调并重新启动应用程序。这并不理想,但至少我可以登录我的应用程序。

【讨论】:

【参考方案3】:

我可以确认,自最近以来,我的公司也遇到了同样的问题。这似乎有点不稳定,不是 100% 的时间。但是对于某些用户,有时他们会看到一个空的登录弹出窗口,其中 url 指向“https://accounts.google.com/o/oauth2/iframe”,但没有任何反应。

【讨论】:

这里也一样。这是一个随机问题 @sniii 你试过用ux_mode: 'redirect',吗,下面看看我的回答 很抱歉投了反对票,但这不是答案,只是对问题的确认。

以上是关于Google 登录 API 挂起并出现未捕获的错误无法从 URL 哈希获取父源的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的类型错误:googleAuth.then 不是函数

MvvmCross Xamarin Android 在初始屏幕上挂起并带有链接

未捕获的TypeError:googleAuth.then不是函数

Google API V3 OAUTH2 挂起 - 未创建 TokenResponse-user 凭据文件

调试随机挂起并使用 100% 处理器内核的 Python 脚本

Google 登录出现异常