如何使用球衣发送经过 NTLM 身份验证的发布请求?

Posted

技术标签:

【中文标题】如何使用球衣发送经过 NTLM 身份验证的发布请求?【英文标题】:How to send NTLM authenticated post request using jersey? 【发布时间】:2015-07-16 13:02:38 【问题描述】:

我正在使用 Java 对 Sharepoint 2013 进行 rest api 调用。如何使用 jersey rest 客户端连接到 sharepoint 2013?

注意:目前我使用的是 apache http 组件和NTCredentials

Credentials credentials=new NTCredentials(username, password, workstation, domain);
AuthScope authScope=new AuthScope(AuthScope.ANY);
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(authScope,credentials);
CloseableHttpClient httpclient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build();

如何将这个应用到 Jersey 框架中?

【问题讨论】:

请提供您尝试创建解决方案的任何代码,提供证据证明您已经进行了一些研究或了解您要达到的目标的基本原理。人们将更有能力帮助更多地了解您正在尝试做的事情,您尝试过的内容,阅读过的内容。您的库和应用程序结构/框架的版本也会有所帮助。 @DanielTung 我已经添加了我的作品 【参考方案1】:

以下代码使用 Jersey 执行 NTLM 身份验证的 HTTP GET 请求:

public Response executeRestGet(String user, String pass) 
    Client client = ClientBuilder.newClient(prepareClientConfig(user, pass));
    WebTarget target = client.target("http://localhost/").path("site/_api/xxxxx");
    return target.request(HTTP_ACCEPT_JSON).get();


private ClientConfig prepareClientConfig(String user, String pass) 
    ClientConfig clientConfig = new ClientConfig();

    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    //make sure to supply all 4 arguments to the  NTCredentials constructor
    credentialsProvider.setCredentials(AuthScope.ANY, new NTCredentials(user, pass, null, null));

    clientConfig.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider);
    clientConfig.connectorProvider(new ApacheConnectorProvider());
    return clientConfig;

请注意,这种方法需要:jersey-apache-connector。 Maven 依赖:

<dependency>
    <groupId>org.glassfish.jersey.connectors</groupId>
    <artifactId>jersey-apache-connector</artifactId>
    <version>2.22.2</version>
</dependency>

【讨论】:

我尝试了建议的解决方案,但如果我发布以下表单:client.target(...).request().post(...) 没有“授权”标头附加到我的请求。我做错了吗? 刚刚发现必须注意类路径中不同库的版本。目前,如果我依赖恰好依赖于 httpclient-library 的 Tika(一个看似无关的库),NTLM 就会中断。就我而言,我怀疑“正确”版本被 gradles 依赖解析换掉了。

以上是关于如何使用球衣发送经过 NTLM 身份验证的发布请求?的主要内容,如果未能解决你的问题,请参考以下文章

BizTalk 发送端口与 NTLM 身份验证和自定义用户和密码

如何使用符合 JAX-RS 2.0 的 RESTEasy 客户端 API 启用 NTLM 身份验证?

Django 1.11-如何使用仅支持NTLM身份验证的邮件服务器发送邮件

使用 Windows Auth NTLM 进行身份验证

HTTP 请求未使用客户端身份验证方案“Ntlm”未经授权从服务器接收到的身份验证标头为“NTLM”

HTTP 请求未经客户端身份验证方案“Ntlm”授权