无法使用 Java API 访问数据中心服务

Can't get access to Data Hub Service using Java API

我正在尝试使用 Java API 在我的数据中心服务上执行搜索。不幸的是,服务器 returns 的 Unauthorized 响应。 这是代码:

  public Object doSearch() throws NoSuchAlgorithmException, KeyManagementException {
    String user = *****;
    String password = ******;
    String db = "data-hub-FINAL";
    String host = "***********.marklogicsvc.com";
    int port = 8011;
    SecurityContext auth = new DatabaseClientFactory.DigestAuthContext(user, password).withSSLContext(SSLContext.getDefault());
    DatabaseClient client = DatabaseClientFactory.newClient(host, port, db, auth);
    try {
      QueryManager qm = client.newQueryManager();
      StructuredQueryBuilder qb = qm.newStructuredQueryBuilder();
      qm.setPageLength(100);
      var query = qb.collection("listings");

      return qm.search(query, new SearchHandle());
    } finally {
      client.release();
    }
  }

我怀疑我使用了错误的凭据,但是当我在 Visual Studio Code Marklogic Extension 中尝试它们时它工作正常,这是我的 VS 代码设置和查询:

    "marklogic.modulesDb": "data-hub-MODULES",
    "marklogic.host": "*******.marklogicsvc.com",
    "marklogic.password": *******,
    "marklogic.username": *******,
    "marklogic.ssl": true,
    "marklogic.port": 8011

查询:

xquery version "3.0";

declare namespace cts = "http://marklogic.com/cts";

cts:search(fn:collection(("listings")), cts:and-query(()))

如果您能告诉我我的 Java 代码有什么问题导致我无法连接到 DHS,我将非常高兴。

我认为您需要使用 BasicAuthContext 而不是 DigestAuthContext,因为 DHS 使用基本身份验证。

我猜你的 SSL 配置没问题,但以防万一 - 我知道文档只显示正在设置 SSLContext - http://docs.marklogic.com/guide/java/intro#id_31958 - 但我通常传入 X509TrustManager 并调用“withSSLHostnameVerifier(DatabaseClientFactory.SSLHostnameVerifier.ANY)”。您可以使用 X509TrustManager 的实现,它接受所有内容进行测试。

但首先尝试 BasicAuthContext 看看是否能解决问题。

@rjrudin 的回答是正确的,但这里有一个完整的代码片段应该可以工作。

        SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
        X509TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];                
            }
        };
        sslContext.init(null, new TrustManager[] { trustManager }, null);

        return DatabaseClientFactory.newClient(
            host, port,
            new DatabaseClientFactory.BasicAuthContext(user, password).withSSLContext(sslContext, trustManager),
            DatabaseClient.ConnectionType.GATEWAY
        );

请注意 DatabaseClient.ConnectionType.GATEWAY 参数,因为您正在使用 DHS 通过负载平衡器进行连接。

另请注意,这不是在验证证书。对于生产实施,您可能希望在您的信任管理器中包含满足您的安全要求的逻辑。