1

我正在使用 Google OAuth 2.0 对已安装的桌面 Java 应用程序进行身份验证。我正在使用 Google OAuth 2.0 Java 客户端库。

当我拨打电话请求用户授权访问他们的 Google 日历时,“请求权限”网页按预期显示在默认浏览器中。用户点击取消或接受后,网页显示消息:

收到验证码。关闭...

在 Internet Explorer 中,网页随即关闭。但是,在 Firefox 和 Chrome 中,网页仍然打开。

有没有办法强制关闭网页(从我的 Java 程序)?

这是我正在使用的触发网页的代码(取自 Google 开发人员的 CalendarSample(http://samples.google-api-java-client.googlecode.com/hg-history/425c5ffc30178f21aea592bc989849ea7e3498fe/calendar-cmdline-sample/instructions .html):

// set up authorization code flow
GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
    httpTransport, JSON_FACTORY, clientSecrets,
    Collections.singleton(CalendarScopes.CALENDAR)).setDataStoreFactory(dataStoreFactory)
    .build();
// authorize
return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
4

1 回答 1

2

我想到了。未关闭的网页由LocalServerReceiver. LocalServerReciever.CallbackHandler.writeLandingHtml()包含以下内容:

doc.println("<script type='text/javascript'>");
// We open "" in the same window to trigger JS ownership of it, which lets
// us then close it via JS, at least on Chrome.
doc.println("window.setTimeout(function() {");
doc.println("    window.open('', '_self', ''); window.close(); }, 1000);");
doc.println("if (window.opener) { window.opener.checkToken(); }");
doc.println("</script>");

此代码试图利用允许 JavaScript 关闭页面的漏洞,即使页面不是由 JS 打开的。该漏洞仍然适用于 IE 11,但不再适用于 FF 31 或 Chrome 36。

经过大量搜索,我了解到 JS 不再可能关闭它没有打开的页面(IE 中现存的利用漏洞除外)。

LocalServerReceiver出于我的目的,我通过稍微修改“解决”了这个问题。我已将网页上显示的消息文本更改为:

收到验证码。关闭...

到:

您的回复已收到。

请关闭此窗口。

LocalServerReceiver 的(未修改的)源可以在这里找到:https ://code.google.com/p/google-oauth-java-client/source/browse/google-oauth-client-jetty/src/main/ java/com/google/api/client/extensions/jetty/auth/oauth2/LocalServerReceiver.java?r=2624919183758196142f47c414e71db685e77de2

于 2014-08-13T18:54:23.633 回答