Camel HTTP身份验证失败,但调用与curl一起使用

时间:2013-09-09 17:21:42

标签: activemq apache-camel twilio http-authentication blueprint-osgi

我正在构建一个Camel路由,该路由将调用Twilio's SMS API来发送短信。 API要求BASIC authentication,但我的调用失败,出现401身份验证错误。我已经从this worked example复制了我的配置,并通过调整呼叫验证了我的凭据是否合理。但是,我无法弄清楚我在Camel方面缺少的东西。

我的Camel HTTP与不强制执行身份验证的API的集成工作正常,Twilio调用的URL正确输入(使用标题* Exchange.HTTP_QUERY *)。

任何帮助非常感谢。感谢。

这是我的Blueprint-OSGi Camel路线: -

<camelContext id="jellyfish-messaging-sms" errorHandlerRef="deadLetterQueue"
    trace="false" xmlns="http://camel.apache.org/schema/blueprint">

     <route id="sms.twilio">
        <from uri="activemq:sms.twilio" />

        <setHeader headerName="Content-Type">
            <constant>application/x-www-form-urlencoded</constant>
        </setHeader>
        <setHeader headerName="CamelHttpMethod">
              <constant>POST</constant>
        </setHeader>

         <to uri="https://api.twilio.com/2010-04-01/Accounts/{{sms.accountSid}}/SMS/Messages" />
    </route>

</camelContext>

<!-- BEANS -->

 <bean id="httpAuth" class="org.apache.camel.component.http.HttpConfiguration">
    <property name="authMethod" value="Basic"/>
    <property name="authUsername" value="${sms.accountSid}"/>
    <property name="authPassword" value="${sms.authToken}"/>
</bean>

<bean id="http" class="org.apache.camel.component.http.HttpComponent">
    <property name="camelContext" ref="jellyfish-messaging-sms"/>
    <property name="httpConfiguration" ref="httpAuth"/>
</bean>

这是例外(来自karaf.log): -

2013-09-09 17:37:27,627 | INFO  | umer[sms.twilio] | HttpMethodDirector               | 366 - org.apache.servicemix.bundles.commons-httpclient - 3.1.0.7 | No credentials available for BASIC 'Twilio API'@api.twilio.com:443
2013-09-09 17:37:27,632 | ERROR | umer[sms.twilio] | jellyfish-messaging              | 266 - org.apache.camel.camel-core - 2.10.2 | Dead letter interceptor invoked
2013-09-09 17:37:27,635 | ERROR | umer[sms.twilio] | sms                              | 266 - org.apache.camel.camel-core - 2.10.2 | Exchange[ExchangePattern:InOnly, BodyType:String, Body:Nothing to see here, CaughtExceptionType:org.apache.camel.component.http.HttpOperationFailedException, CaughtExceptionMessage:HTTP operation failed invoking https://api.twilio.com/2010-04-01/Accounts/...snip.../SMS/Messages?From=%2B44...snip...&To=%2B44...snip...&Body=fred with statusCode: 401, StackTrace:org.apache.camel.component.http.HttpOperationFailedException: HTTP operation failed invoking https://api.twilio.com/2010-04-01/Accounts/...snip.../SMS/Messages?From=%2B44...snip...&To=%2B44...snip...&Body=fred with statusCode: 401   at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:229) at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:157)

这是工作卷曲: -

curl -X POST https://api.twilio.com/2010-04-01/Accounts/...snip.../SMS/Messages -u ...snip...:...snip... -d "From=+44...snip..." -d "To=+44...snip..." -d 'Body=Hello'

2 个答案:

答案 0 :(得分:1)

所以,我已经找到了解决这个问题的方法,得到了朋友,Eclipse调试和Charles代理的一些帮助。由于某种原因,HttpConfiguration和HttpComponent对象未正确附加到Camel上下文,这意味着Camel正在生成另一个HTTP配置,该配置不知道auth详细信息。

该解决方案绕过基于bean的解决方案进行身份验证,而不是使用端点上的身份验证选项。它还将消息体设置为查询参数(我根据消息体的内容在bean中构建),而不是使用* Exchange.HTTP_QUERY * JMS头(又名 CamelHttpQuery )。

<route id="sms.twilio">
  <from uri="activemq:sms.twilio" />
    <unmarshal ref="smsProto" />

    <!-- set the query params to be sent -->
    <transform>
      <method bean="Sender" method="getQuery"/>
    </transform>

    <to uri="activemq:sms.twilio?preserveMessageQos=true" />
</route>

<route id="sms.twilio.send">
  <from uri="activemq:sms.twilio.send" />

  <setHeader headerName="Content-Type">
    <constant>application/x-www-form-urlencoded</constant>
  </setHeader>
  <setHeader headerName="CamelHttpMethod">
    <constant>POST</constant>
  </setHeader>

 <to uri="https://api.twilio.com/2010-04-01/Accounts/{{sms.accountSid}}/Messages?authMethod=Basic&amp;authUsername={{sms.accountSid}}&amp;authPassword={{sms.authToken}}" />
</route>

我很想知道为什么基于bean的身份验证不起作用。

学家

答案 1 :(得分:1)

我遇到了类似的情况,我的.to(http://)端点((使用与你类似的Bean配置)会突然抛出HTTP 403 Forbidden响应,而它曾经正常工作并且在使用时仍能正常工作卷曲。

这里的诀窍是使用抢先身份验证。即使您在Camel端点上正确配置了authUsername,authPassword和authMethod(通过bean或端点本身),Camel也不会在第一个请求中发送身份验证详细信息。它希望在未经授权的情况下发送401 Unauthorized,然后才能在新请求中发送身份验证详细信息。

我只是通过使用tcpdump来检查请求,但解决方案很简单:

.to("http://endpoint" + "?httpClient.authenticationPreemptive=true")

来源: http://camel.465427.n5.nabble.com/HTTP-Basic-Authentication-tp5742229p5742347.html 文档: http://camel.apache.org/http.html