【问题标题】:Using Google Direcory API with SSH Tunnel将 Google Directory API 与 SSH 隧道一起使用
【发布时间】:2016-10-11 01:18:30
【问题描述】:

错误:

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

我们在 WAS 中部署了一个 java 应用程序,它将使用 Google Directory API。 WAS 位于应用层,不允许访问 Internet 上的 Google API。因此,网络团队打开了一个 SSH 隧道,以便 WAS 可以通过与默认 ssl 端口 443 不同的端口 (22230) 访问 Google API。更新了 java 代码以使用新端口的范围值,但最终以“上面提到的 invalid_scope 错误。

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

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

【问题讨论】:

    标签: java ssh google-api ssh-tunnel google-directory-api


    【解决方案1】:

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

    使用如下代码sn-p来实现:

    GoogleCredential credential = (new com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder()).setTransport(httpTransport).setJsonFactory(jsonFactory).setTokenServerUrl(new GenericUrl("@987654321 @")).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();

    上述代码 sn-p 将覆盖由 Google API 客户端库(Jar 文件)设置的默认服务 URL 值。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我们尝试从 cope URL 中删除端口,结果出现无法识别的 SSL 消息错误:javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?在 com.ibm.jsse2.ac(a.java:91) 在 com.ibm.jsse2.aa(a.java:213) 在 com.ibm.jsse2.qc.a(qc.java:320) 在 com. ibm.jsse2.qc.h(qc.java:428) 在 com.ibm.jsse2.qc.a(qc.java:813) 在 com.ibm.jsse2.qc.startHandshake(qc.java:636) 在 com .ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:22) 在 com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:10) 在 com .ibm.net.ssl.www2.protocol.https.b.connect(b.java:55)
      • 参见@SanjayPatra 的回答,他提到使用客户端库中已经提供的方法来更改基本 URL。看起来 Google 已经预料到了这一点,并在某些情况下已经在侦听环回接口标准端口 (80/443) 或者您无法修改环境的情况下为您提供了一个输出。
      猜你喜欢
      • 2013-07-30
      • 2017-10-20
      • 2016-02-07
      • 2016-11-10
      • 2020-06-21
      • 2017-06-01
      • 1970-01-01
      • 2017-09-08
      • 2013-07-13
      相关资源
      最近更新 更多