无法使用 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 通过负载平衡器进行连接。
另请注意,这不是在验证证书。对于生产实施,您可能希望在您的信任管理器中包含满足您的安全要求的逻辑。
我正在尝试使用 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 通过负载平衡器进行连接。
另请注意,这不是在验证证书。对于生产实施,您可能希望在您的信任管理器中包含满足您的安全要求的逻辑。