So, I've found a way around this, with a bit of help from a friend, Eclipse debugging and the Charles proxy. For some reason, the HttpConfiguration and HttpComponent objects were not being correctly attached to the Camel context, meaning that Camel was generating another HTTP configuration, which was unaware of the auth details.
The solution bypasses the bean-based solution for authentication, using instead the authentication options on the endpoint. It also sets the message body to be the query parameters (which I build in a bean from the contents of the message body), rather than use the *Exchange.HTTP_QUERY* JMS header (aka 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>
I would be interested to know why the bean-based authentication didn't work, however.
J.