我正在构建一个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'
答案 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&authUsername={{sms.accountSid}}&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