使用 Google 目录 API 和 SSH 隧道

Using Google Direcory API with SSH Tunnel

错误:

com.google.api.client.auth.oauth2.TokenResponseException: 400 错误请求 { "error" : "invalid_scope", "error_description":“https://www.googleapis.com:22230/auth/admin.directory.user 不是有效范围。” }

我们在 WAS 中部署了一个 java 应用程序,它将使用 Google 目录 API。 WAS是放在应用层的,不允许在internet上访问GoogleAPI。因此,网络团队打开了一个 SSH 隧道,以便 WAS 可以通过与默认 ssl 端口 443 不同的端口 (22230) 访问 Google API。更新了 java 代码以使用范围新端口的值,但最终出现上述 "invalid_scope" 错误。

范围 = Arrays.asList(""https://www.googleapis.com:22230/auth/admin.directory.user"); 凭证 = 新 GoogleCredential.Builder() .setTransport(http传输) .setJsonFactory(jsonFactory) .setServiceAccountUser(properties.getProperty(ACCT_USER)) .setServiceAccountId(properties.getProperty(ACCT_ID)) .setServiceAccountScopes(范围) .setServiceAccountPrivateKeyFromP12File( p12 ) 。建造();

谷歌搜索并没有帮助我找到很多关于 SSH 隧道和 Google API 用法的信息。任何帮助将不胜感激。当 SSH 隧道完成时,是否有推荐的使用 Google 目录 API 的方法?

据我所知,范围不会改变客户端库发出的网络请求的目的地,它们的存在只是为了告诉 Google 您正尝试授权您的服务用于如此放置的范围范围 URL 中的端口更改了它,它将无法与已知列表匹配。由于您必须更改客户端库才能更改目的地,因此我会选择网络请求的执行环境重定向来满足您的需求。例如,您可以使用主机重定向到给定地址的环回,其中您有一个开瓶器代理等待请求并将 SSH 隧道传输到您的端点。由于您显示来自 Google 的 400 响应,看来您的流量已经正确路由,您所要做的就是从范围 URL 中删除 :22230

您需要覆盖 GoogleCredential 对象中的“tokenServerEncodedUrl”参数值,以及“rootUrl”使用非标准 SSH 隧道端口进行 GoogleAPI 客户端通信的目录对象中的参数值。

使用下面的代码片段来实现它:

GoogleCredential credential = (new com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder()).setTransport(httpTransport).setJsonFactory(jsonFactory).setTokenServerUrl(new GenericUrl( "https://accounts.google.com:ssh-port/o/oauth2/token")).setServiceAccountUser(ACCT_USER).setServiceAccountId(ACCT_ID).setServiceAccountScopes(SCOPES).setServiceAccountPrivateKeyFromP12File(p12).build();

目录服务 = (new com.google.api.services.admin.directory.Directory.Builder(httpTransport, jsonFactory, null)).setHttpRequestInitializer(credential).setRootUrl("https://www.googleapis.com:22230/")。 setApplicationName(APP_NAME).build();

以上代码片段应覆盖 Google API 客户端库(Jar 文件)设置的默认服务 URL 值。