无法与 Internet Explorer 一起使用的 Web 应用程序的 Google 登录

Posted

技术标签:

【中文标题】无法与 Internet Explorer 一起使用的 Web 应用程序的 Google 登录【英文标题】:Google Sign In for Web Apps not working with Internet Explorer 【发布时间】:2015-10-08 06:14:08 【问题描述】:

使用 Google 提供的 quick start sample,我已经能够让 Web 应用程序登录以在 Chrome 和 Firefox 中工作。但是,它在 Internet Explorer(版本 11)上失败。它将用户登录到 Google,但永远不会调用 data-onsuccess 回调。并且通常没有任何错误的通知。

我已阅读related question 并尝试了有关受信任站点的建议。我还尝试过调整 IE 何时接受 3rd 方 cookie,但这些似乎都不起作用。

我正在使用的测试页面的代码如下(减去客户端 ID)

<html>
<head>
<meta charset="ISO-8859-1">
<title>Google Sign In</title>
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="google-signin-client_id" content="CLIENT_ID_FROM_GOOGLE_HERE">
<script>

function onSignIn(googleUser) 
    var profile = googleUser.getBasicProfile();
    console.log('ID: ' + profile.getId());
    console.log('Name: ' + profile.getName());
    console.log('Image URL: ' + profile.getImageUrl());
    console.log('Email: ' + profile.getEmail());


function signOut() 
    console.log(document);

    var auth2 = gapi.auth2.getAuthInstance();
    auth2.signOut().then(function () 
        console.log('User signed out.');
    );

</script>
</head>

<body>
<h1>Login</h1>
<p>
This is a simple page to test Google Sign In IE
</p>

<div class="g-signin2" data-onsuccess="onSignIn">
   Sign In Button Rendered Here
</div>

<div>
    <a href="#" onclick="signOut();">Sign out</a>
</div>
</body>
</html>

正如一些answers 所建议的那样,我还尝试了使用侦听器来侦听更改的代码。这种方法我也没有成功。再次在 Chrome/Firefox 中有效,但在 IE 中无效。

我确实经常(不是一直)在控制台中看到“SCRIPT5:访问被拒绝”错误消息。不完全确定为什么,但我确实注意到,当页面最终加载时,一些 Google 代码位于 &lt;iframe&gt; 中,我想知道这是否是问题的一部分。

我将上述测试页面托管在 Apache 的本地实例(在 Windows 中运行)上,我想知道是否存在跨域问题,可能与来自 Google 的 &lt;iframe&gt; 中的代码有关。

我现在完全不知所措,我很想知道是否有人设法让它与 IE 一起使用。 IE 是否需要一些配置才能使其正常工作?是否需要对代码进行更改才能使其工作?还是在 IE 中根本无法使用?

我可以尝试的替代方法是server side flow,但我不确定这是否可以避免问题,理想情况下我想使用客户端方法。

感谢任何反馈。谢谢。

编辑:我主持了一个说明问题的simple page。此页面适用于 Chrome、Firefox 和 Safari。但是在使用 IE (v11) 时会失败。

【问题讨论】:

凹凸:我有同样的问题,同样的错误。我看到“SCRIPT5:访问被拒绝。文件:iframe,行:1,列:1” iframe 是:&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;title&gt;&lt;/title&gt;&lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;&lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;&lt;meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=0"&gt;&lt;script src='https://ssl.gstatic.com/accounts/o/4085826231-idpiframe.js'&gt;&lt;/script&gt;&lt;/head&gt;&lt;body &gt;&lt;script type="text/javascript"&gt;lso.startIdpIFrame();&lt;/script&gt;&lt;/body&gt;&lt;/html&gt; 我们需要谷歌来解决这个问题。有人知道向他们提出问题的方法吗?我将这个问题和另一个 (***.com/questions/31170572/…) 的标签更新为他们推荐的两个标签 (groups.google.com/forum/#!topic/google-federated-login-api/…) 【参考方案1】:

Google 身份团队 fixed this in November。如果您继续在JavaScript demo hosted at GitHub 上看到问题,请report and issue。

您可以查看以下演示以查看 Edge/IE11 上的示例工作:

Minimal Demo Sample demo Minimal Demo with insecure HTTP origin

【讨论】:

您可以将 HTTP 源添加到“最小演示”吗?它适用于 Internet Explorer 11 中的 HTTPS,但我无法让它适用于 HTTP 协议(​​即使它在其他浏览器中也能正常工作) 谢谢,正如预期的那样,在您的域中工作正常,但是当我将您完全相同的代码复制到我的域时,仅在 Internet Explorer 11 中继续要求关闭 Google 登录窗口并且不起作用。我不知道 IE11 可能有什么问题,因为 Google Developers Console 中的客户端 ID 看起来正确,并且在其他浏览器中运行良好。唯一的区别是当它工作时,调用这个 URL:accounts.google.com/o/oauth2/iframerpc?action=issueToken&... 而在我的 IE11 中的服务器中没有调用任何 看起来问题只发生在带有 IE11 和 Edge 的 LAN 中(外部访问在所有浏览器中都可以正常工作)。 当然,我们使用了我们的客户端ID,它在其他浏览器中运行良好,但在IE11中还不行【参考方案2】:

我使用了登录,它对我有用..

这是我的 IE 版本:

【讨论】:

我也得到了弹出窗口。但是在接受之后,你真的得到了登录吗(按钮是否改变了,你的 onsuccess 回调被调用了吗? 是的,我做到了,事实上在我连接的应用程序列表中它被列出了.. 并且您使用的代码与谷歌的开发人员指南相同,那么您必须了解您留下了一些代码行,因为您需要将 ID 令牌传递到您的网站后端,而这就是您没有包含的内容在代码中......从那里收集响应,这就是你没有包含的内容 这不是我的代码,但在我的环境中我会这样做。但是由于从未调用过 onsuccess,我没有 jwt 可以传递。 另外,我注意到我的 IE11 版本是 11.0.9600.17959【参考方案3】:

尝试从 google 以外的其他地方加载您的脚本。根据这个问题(Preventing "SCRIPT5: Access is denied" error in IE),“SCRIPT5:访问被拒绝。”错误是女士必须“保护”用户免受 XSS 攻击的一种方式。

所以,请尝试下载 https://apis.google.com/js/platform.js 并在本地服务器上使用它。

【讨论】:

好主意,但没有效果。由于platform.js 添加了引用谷歌服务器的&lt;script&gt; 标签,也许它仍然是一个XSS 问题。不过感谢您的想法,这是个好主意。【参考方案4】:

在这个问题上有什么新想法吗?尝试使用 g-signin2 方法时,我也看到了同样的问题。我现在在所有浏览器上都在使用旧的 s-gignin,没有问题。

奇怪的是,这适用于我在 IE10 浏览器上,但不适用于 IE11 或 Edge

【讨论】:

这对我也适用于 g-signin。当我切换到 g-signin2 时,问题就开始了。【参考方案5】:

在 localhost 中运行时,如果在登录页面中将表单 ID 添加到表单中,则通过 Google 登录按钮登录后将不会处理。即使登录状态也不会更改为 Google 登录按钮上的“已签名”。但这可以通过在公共服务器上运行页面来解决,因为 IE 具有在本地运行时限制脚本的功能。

【讨论】:

以上是关于无法与 Internet Explorer 一起使用的 Web 应用程序的 Google 登录的主要内容,如果未能解决你的问题,请参考以下文章

dojoquery与最近的方法无法在Internet Explorer中工作

JavaScript XMLDOM XML XSL Internet Explorer - 我无法在浏览器中显示转换后的文件

如何使用 Internet Explorer 使 div 居中?

jQuery .attr() 使 Internet Explorer 崩溃

Internet Explorer 7 iframe,使高度 100%

5 星和金色 5 星不在一起(使用 Internet Explorer 浏览时)