呼叫的NTLMv2通过Apache的骆驼安全端点

问题描述:

我使用Apache的骆驼2.19,我能够调用使用骆驼HTTP模块我的终点,它支持NTLMv1身份开箱时要使用NTLMv1身份:呼叫的NTLMv2通过Apache的骆驼安全端点

from("activemq:{{queue.feedback}}") 
    .to("http://localhost:8888/ntlm/secured?authMethodPriority=NTLM 
       &authMethod=NTLM&authUsername=Zaphod 
       &authPassword=Beeblebrox&authDomain=Minor 
       &authHost=LightCity") 

的问题是我无法弄清楚如何使用NTLMv2进行请求。 的official documentation指出:

注:HTTP的骆驼是基于HttpClient的3.x版,因此只有 什么被称为NTLMv1身份,在 NTLM协议的早期版本的支持有限。它根本不支持NTLMv2。 camel-http4有 支持NTLMv2。

当我尝试使用骆驼http4它根本不值一提:

from("activemq:{{queue.feedback}}") 
    .to("http4://localhost:8888/ntlm/secured?authMethodPriority=NTLM 
       &authMethod=NTLM&authUsername=Zaphod 
       &authPassword=Beeblebrox&authDomain=Minor 
       &authHost=LightCity") 

看来,骆驼http4不知道NTLM都没有。我试图调查camel-http4 repo on GitHub,除了文档之外,我找不到与NTLM相关的任何内容。

任何有关如何在Camel 2.19中使用NTLMv2的想法(骆驼的其他版本可能也很适合)?

问题出在camel-http4组件上。默认情况下,它使用InputStreamEntity,它不是HttpEntity实体的可重复实现,这意味着一旦读取了流 - 它已关闭,并且无法再读取它。这导致MainClientExec失败:

if (execCount > 1 && !RequestEntityProxy.isRepeatable(request)) { 
    throw new NonRepeatableRequestException("Cannot retry request with a non-repeatable request entity."); 
} 

这似乎是一个错误,因此解决办法是InputStreamEntity转换为ByteArrayEntity(这是重复的)是在发送请求之前:

@Component 
public class NtlmProcessor implements Processor { 

    @Override 
    public void process(Exchange exchange) throws Exception { 
     HttpEntity httpEntity = exchange.getIn().getBody(HttpEntity.class); 

     byte[] bytes = EntityUtils.toByteArray(httpEntity); 

     ByteArrayEntity byteArrayEntity = new ByteArrayEntity(bytes, ContentType.get(httpEntity)); 

     exchange.getOut().setBody(byteArrayEntity); 
    } 
}