TwitterOAuth 1.0请求和驼峰路由

TwitterOAuth 1.0请求和驼峰路由,twitter,oauth,apache-camel,twitter-oauth,Twitter,Oauth,Apache Camel,Twitter Oauth,我需要创建一个camel路由,它向twitterapi发出Rest请求。我知道有可能使用twitter组件,但在我的例子中,我需要使用http4组件发出Http请求。由于该组件不支持Oauth的OOTB,我创建了以下处理器,以便根据twitter文档创建必要的头文件,但我得到了错误响应,我不明白我做错了什么: @Override public void process(Exchange exchange) throws Exception { int millis = (int) S

我需要创建一个camel路由,它向twitterapi发出Rest请求。我知道有可能使用twitter组件,但在我的例子中,我需要使用http4组件发出Http请求。由于该组件不支持Oauth的OOTB,我创建了以下处理器,以便根据twitter文档创建必要的头文件,但我得到了错误响应,我不明白我做错了什么:

@Override
public void process(Exchange exchange) throws Exception {


    int millis = (int) System.currentTimeMillis() * -1;
    int time = (int) millis / 1000;

    /**
     * Listing of all parameters necessary to retrieve a token
     * (sorted lexicographically as demanded)
     */
    String[][] data = {
            {"oauth_consumer_key", "<consumer_key>"},
            {"oauth_nonce",  String.valueOf(millis)},
            {"oauth_signature", ""},
            {"oauth_signature_method", "HMAC-SHA1"},
            {"oauth_timestamp", String.valueOf(time)},
            {"oauth_token", "<token>"},
            {"oauth_version", "1.0"}
    };

    HttpMethods methodObject = exchange.getIn().getHeader(Exchange.HTTP_METHOD, HttpMethods.class);
    String method = methodObject.toString();
    String uri = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class);
    String path = exchange.getIn().getHeader(Exchange.HTTP_PATH, String.class);
    String query = exchange.getIn().getHeader(Exchange.HTTP_QUERY, String.class);

    String url = uri;
    if (path!=null){
        url += path;
    }


    LOGGER.info("URL= "+url);

    /**
     * Generation of the signature base string
     */
    String signature_base_string =
            method+"&"+ URLEncoder.encode(url, "UTF-8")+"&";
    signature_base_string+=URLEncoder.encode(query, "UTF-8") + "%26";

    LOGGER.info("signature_base_string= "+signature_base_string);


    for(int i = 0; i < data.length; i++) {
        // ignore the empty oauth_signature field
        String additional ="";
        if(i != 2) {
            additional = URLEncoder.encode(data[i][0], "UTF-8") + "%3D" +
                    URLEncoder.encode(data[i][1], "UTF-8") ;

            if (i!= data.length-1){
                additional += "%26";
            }

            signature_base_string += additional;
            LOGGER.info("signature_base_string-Additional= "+additional);
        }

    }

    /**
     * Sign the request
     */
    Mac m = Mac.getInstance("HmacSHA1");
    m.init(new SecretKeySpec(("<consumer_secret>&<token_secrer>").getBytes(), "HmacSHA1"));
    m.update(signature_base_string.getBytes());
    byte[] res = m.doFinal();
    String sig = String.valueOf(new BASE64Encoder().encode(res));
    data[2][1] = sig;

    /**
     * Create the header for the request
     */
    String header = "OAuth ";
    for(String[] item : data) {
        header += item[0]+"=\""+item[1]+"\", ";
    }
    // cut off last appended comma
    header = header.substring(0, header.length()-2);

    String charset = "UTF-8";
    exchange.getIn().setHeader("Authorization", header);
    exchange.getIn().setHeader("Accept-Charset", charset);

}

解决方案是通过Scribe库(作为camel处理器提供)实现oauth,而不是依赖于camel-http4组件。 这是:

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.scribe.oauth.OAuthService;
import org.scribe.builder.ServiceBuilder;
import org.scribe.model.OAuthRequest;
import org.scribe.model.Response;
import org.scribe.model.SignatureType;
import org.scribe.model.Token;
import org.scribe.model.Verb;

public class OAuth10a implements Processor{

@Override
public void process(Exchange exchange) throws Exception {

    OAuthService service = new ServiceBuilder().provider(OneLeggedApi10.class)
        .apiKey(exchange.getProperty("target_key", String.class))                
        .apiSecret(exchange.getProperty("target_secret", String.class)) 
        /*.debugStream(System.out).*/
        .signatureType(SignatureType.QueryString)
        /*.scope("*").*/
        .build();

    String Url = exchange.getIn().getHeader("CamelHttpUri", String.class);
    String Method = exchange.getIn().getHeader("CamelHttpMethod", String.class);

    OAuthRequest request = null;
    if (Method.equals("GET")) {
        request = new OAuthRequest(Verb.GET, Url);
    } else {

        if (Method.equals("POST")) { request = new OAuthRequest(Verb.POST, Url); }
        if (Method.equals("PUT")) { request = new OAuthRequest(Verb.PUT, Url); }

        String payload = exchange.getIn().getBody(String.class);
        request.addPayload(payload);
        request.addHeader("Content-Type", "application/json;charset=UTF-8");
    }

    service.signRequest(new Token("", ""), request);
    Response response = request.send();

    exchange.setOut(exchange.getIn());
    exchange.getOut().setBody(response.getBody());
}
}
在blueprint camel上下文中,您只需以这种方式调用它:

     <bean id="oauth10a" class="net.monstock.msc.config.common.OAuth10a"/>
 ...
 <camelContext ...
      <route ...
           <setProperty propertyName="target_key"><constant>KJFDFGHJKL</constant></setProperty>
           <setProperty propertyName="target_secret"><constant>kjhgfdertyuiolkjhgfrtyu</constant></setProperty>

           <setHeader headerName="CamelHttpMethod"><constant>POST</constant></setHeader>
           <setHeader headerName="CamelHttpUri"><simple>http://your.service.url/point</simple></setHeader>
           <process ref="oauth10a"/>

...
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.scribe.oauth.OAuthService;
import org.scribe.builder.ServiceBuilder;
import org.scribe.model.OAuthRequest;
import org.scribe.model.Response;
import org.scribe.model.SignatureType;
import org.scribe.model.Token;
import org.scribe.model.Verb;

public class OAuth10a implements Processor{

@Override
public void process(Exchange exchange) throws Exception {

    OAuthService service = new ServiceBuilder().provider(OneLeggedApi10.class)
        .apiKey(exchange.getProperty("target_key", String.class))                
        .apiSecret(exchange.getProperty("target_secret", String.class)) 
        /*.debugStream(System.out).*/
        .signatureType(SignatureType.QueryString)
        /*.scope("*").*/
        .build();

    String Url = exchange.getIn().getHeader("CamelHttpUri", String.class);
    String Method = exchange.getIn().getHeader("CamelHttpMethod", String.class);

    OAuthRequest request = null;
    if (Method.equals("GET")) {
        request = new OAuthRequest(Verb.GET, Url);
    } else {

        if (Method.equals("POST")) { request = new OAuthRequest(Verb.POST, Url); }
        if (Method.equals("PUT")) { request = new OAuthRequest(Verb.PUT, Url); }

        String payload = exchange.getIn().getBody(String.class);
        request.addPayload(payload);
        request.addHeader("Content-Type", "application/json;charset=UTF-8");
    }

    service.signRequest(new Token("", ""), request);
    Response response = request.send();

    exchange.setOut(exchange.getIn());
    exchange.getOut().setBody(response.getBody());
}
}
     <bean id="oauth10a" class="net.monstock.msc.config.common.OAuth10a"/>
 ...
 <camelContext ...
      <route ...
           <setProperty propertyName="target_key"><constant>KJFDFGHJKL</constant></setProperty>
           <setProperty propertyName="target_secret"><constant>kjhgfdertyuiolkjhgfrtyu</constant></setProperty>

           <setHeader headerName="CamelHttpMethod"><constant>POST</constant></setHeader>
           <setHeader headerName="CamelHttpUri"><simple>http://your.service.url/point</simple></setHeader>
           <process ref="oauth10a"/>