代码之家  ›  专栏  ›  技术社区  ›  Jeremy Gooch

Camel HTTP身份验证失败,但调用可以使用curl

  •  2
  • Jeremy Gooch  · 技术社区  · 12 年前

    我正在建造一条Camel路线,可以打电话给 Twilio's SMS API 发送短信。API要求 BASIC authentication 但我的呼叫失败了,出现了401身份验证错误。我已从中复制配置 this worked example 并通过卷曲电话来验证我的凭据是否正确。然而,我无法计算出我在骆驼队缺少了什么。

    我的Camel HTTP与不强制身份验证的API的集成都很好,Twilio调用的URL也被正确地提供(使用头部*Exchange.HTTP_QUERY*)。

    非常感谢您的帮助。谢谢

    这是我的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 回复  |  直到 12 年前
        1
  •  2
  •   Jeremy Gooch    12 年前

    因此,在朋友的帮助下,我找到了解决这个问题的方法,Eclipse调试和Charles代理。出于某种原因,HttpConfiguration和HttpComponent对象没有正确地附加到Camel上下文,这意味着Camel正在生成另一个HTTP配置,而该配置不知道身份验证的详细信息。

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

    <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的身份验证不起作用。

    J

        2
  •  2
  •   Jaap Emiliano Schiano    9 年前

    我也遇到过类似的情况,我的.to(http://)端点(使用与您类似的Bean配置)会突然抛出http 403 Forbidden响应,而它过去可以正常工作,在使用curl时仍然可以正常工作。

    在这里,诀窍是使用 先发制人的身份验证 。即使您在Camel端点上(通过bean或在端点本身中)正确配置了authUsername、authPassword和authMethod,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