【问题标题】:Can't get access to Data Hub Service using Java API无法使用 Java API 访问数据中心服务
【发布时间】:2020-10-16 20:46:46
【问题描述】:

我正在尝试使用 Java API 在我的数据中心服务上执行搜索。不幸的是,服务器返回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 Code 设置和查询:

 "marklogic.modulesDb": "data-hub-MODULES",
    "marklogic.host": "*******.marklogicsvc.com",
    "marklogic.password": *******,
    "marklogic.username": *******,
    “marklogic.ssl”:是的,
    “marklogic.port”:8011

查询:

xquery version "3.0";

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

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

如果您告诉我我的 Java 代码出了什么问题,我无法连接到 DHS,我会非常高兴。

【问题讨论】:

    标签: java marklogic marklogic-dhf


    【解决方案1】:

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

            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 连接。

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

    【讨论】:

      【解决方案2】:

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

      我猜你的 SSL 配置很好,但以防万一 - 我知道文档只显示设置了 SSLContext - http://docs.marklogic.com/guide/java/intro#id_31958 - 但我通常传入 X509TrustManager 并调用“withSSLHostnameVerifier(DatabaseClientFactory.SSLHostnameVerifier.ANY )”。您可以使用 X509TrustManager 的 impl 来接受所有测试。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-01
        相关资源
        最近更新 更多