2010-06-28 87 views
1

近两天来我一直在对付这个问题,我希望有人能够帮助我。在Apache服务器上支持XAuth的PHP Twitter代理

我住在中国,并有一台位于香港的服务器(共享主机)。我在服务器上设置了一个PHP Twitter代理,并使用Twitter for iPhone(AKA Tweetie)连接到代理。过去一年左右它的运作非常好。

昨天更新了iPhone的Twitter,现在需要XAuth授权才能连接到twitter.com(以前,它使用的是基本身份验证)。自更新以来,我无法使用我的代理对自己进行身份验证,尽管(我相信是)对我的代理进行了适当的更改。

从概念上讲,这不是一个非常难以解决的问题。为了使用XAuth与twitter.com进行身份验证,应用必须发送POST请求至https://api.twitter.com/oauth/access_token。 POST正文必须是这样的形式:

x_auth_username=aUserName&x_auth_mode=client_auth&x_auth_password=aPassword 

此外,POST请求必须在形式Authorization头:

OAuth oauth_signature_method="HMAC-SHA1", oauth_consumer_key="IQKbtAYlXsomeLGkey0HUA", oauth_nonce="8B265865-3F57-44FF-BCD6-E009EA7D4615", oauth_signature="sbwblaho64blahr934mZQ+23DYQ=", oauth_timestamp="1277356846", oauth_version="1.0" 

因此,使用什么我做的.htaccess复制该验证头使用此代码$ _REQUEST变量:

RewriteCond %{HTTP:Authorization} ^OAuth.* 
RewriteRule (.*) index.php?OAuth=%{HTTP:Authorization} [QSA,L] 

我的代理副本是$ _REQUEST变量的内容到一个实例变量名为$自我> oauthHeader。然后,我做它作为一个头添加到使用下面的代码我卷曲的要求:

if (isset($this->oauthHeader)) {  
    $headers[] = 'Authorization: '.$this->oauthHeader; 
    $headers[] = 'Content-Type: application/x-www-form-urlencoded'; 
    $curl_options[CURLOPT_HTTPHEADER] = $headers; 
} 

我也是原始请求的POST机身采用增加卷曲的POST体:

$curl_options[CURLOPT_POST] = true; 
$curl_options[CURLOPT_POSTFIELDS] = @file_get_contents("php://input"); 

我送向Twitter发送cURL请求。似乎一切正常,但我不可避免地收到“无法验证oauth签名和令牌”的回复。

我在我的智慧结束,我不能为我的生活认为我做错了什么。任何帮助将非常感激。

回答

0

您可以使用此替代解决方案,因为只有越狱的iOS设备:http://code.google.com/p/gfwinterceptor/

+0

这很有趣,但我正在寻找一个服务器端解决方案。我不会越狱我的iPhone,我很好奇看到我在PHP或我的一般方法中解决该问题所犯的错误。 – Anthony 2010-07-28 09:31:59

+0

我建议使用OAuth设置一个与Twitter对话的服务,移动客户端将使用基本身份验证与Proxy进行通话,这是一种简单的方法。 而且,由于您在代码中收到了一个签名错误,因此应该是您不实际转发Twitter用于身份验证的所有特殊标头的情况。 – overboming 2010-07-28 13:23:22