Twitter4J与mod_proxy

时间:2018-04-17 11:39:02

标签: twitter4j mod-proxy

我正在使用twitter4j从只能将代理联系到互联网的应用程序发布推文。所以我在代理上设置了一个带有这个配置的apache虚拟主机:

ProxyPass           /rest/1.1/  https://api.twitter.com/1.1/
ProxyPassReverse    /rest/1.1/  https://api.twitter.com/1.1/

所以我的应用程序请求将是https://proxy.com/rest/1.1/update ....的POST,它将被代理到Twitter Rest API(https://api.twitter.com/1.1/update..。),到目前为止一直很好。
为了符合auth-header,标头内的oauth签名是针对每个具有原始twitter api url的请求计算的(否则认证将失败,因为主机url将是代理URL)。 POST请求本身成功,但抛出了另一个错误:

{"errors":[{"code":220,"message":"Your credentials do not allow access to this resource."}]}

我不知道,还有什么可做的。顺便说一句:相同的应用程序代码成功直接连接到api.twitter.com

1 个答案:

答案 0 :(得分:0)

好的,叫我白痴。正确的重写方法应该包括访问令牌(而不是null):

@Override
public String getAuthorizationHeader(HttpRequest req) {

    if (logger.isDebugEnabled()) {
        logger.debug(req.getURL());
        logger.debug(req.getRequestHeaders().toString());
    }

    //replace proxy url with twitterapi only for signature!!
    String restBaseUrl = this.conf.getRestBaseURL();
    String twitterRestBaseUrl = this.twitterRestBaseUrl;
    String modUrl = req.getURL().replace(restBaseUrl, twitterRestBaseUrl);

    //generate Token from stored values in provided config
    AccessToken token = new AccessToken(conf.getOAuthAccessToken(), conf.getOAuthAccessTokenSecret());

    return super.generateAuthorizationHeader(req.getMethod().name(), modUrl, req.getParameters(), token);
}

仍然不确定是否需要更换代理网址,但现在它可以正常工作.....