我正在使用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
答案 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);
}
仍然不确定是否需要更换代理网址,但现在它可以正常工作.....