2010-06-28 3 views
1

Je me bats la tête contre ce problème depuis bientôt deux jours, et j'espère que quelqu'un sur ce site pourra m'aider. Je vis en Chine et j'ai un serveur (hébergement mutualisé) situé à Hong Kong. J'ai mis en place un proxy Twitter PHP sur le serveur, et je me connecte au proxy en utilisant Twitter pour iPhone (AKA Tweetie). Cela a fonctionné magnifiquement pour l'année écoulée.Proxy Twitter PHP qui prend en charge XAuth sur un serveur Apache

Twitter pour iPhone a été mis à jour hier et nécessite maintenant l'autorisation XAuth pour se connecter à twitter.com (auparavant, il utilisait Basic Auth). Depuis la mise à jour, je n'ai pas été en mesure de m'authentifier en utilisant mon proxy, en dépit de faire (ce que je crois être) les changements appropriés à mon proxy.

Conceptuellement, ce n'est pas un problème très difficile à résoudre. Afin de s'authentifier avec twitter.com en utilisant XAuth, une application doit envoyer une requête POST au https://api.twitter.com/oauth/access_token. Le corps POST doit être de la forme:

x_auth_username=aUserName&x_auth_mode=client_auth&x_auth_password=aPassword 

De plus, la requête POST doit avoir un en-tête d'autorisation sous la forme:

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" 

Alors, ce que je l'ai fait est utilisé .htaccess pour copier l'en-tête Auth à une variable $ _REQUEST en utilisant ce code:

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

Mes copies proxy le contenu de cette variable $ _REQUEST à une variable d'instance appelée auto $> oauthHeader. Ensuite, je fais l'ajouter en tête à ma demande cURL en utilisant le code suivant:

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

-je ajouter aussi le corps POST de la demande initiale au corps POST du cURL en utilisant:

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

J'envoie la Demande de cURL sur Twitter. Tout semble fonctionner correctement, mais je reçois inévitablement une réponse de "Impossible de valider la signature et le jeton oauth". Je suis à bout de nerfs, et je ne peux pas penser à ce que je fais de mal pour la vie de moi-même. Toute aide serait très appréciée.

Répondre

0

Vous pouvez utiliser cette solution de rechange, pour les appareils iOS jailbreakés seulement: http://code.google.com/p/gfwinterceptor/

+0

Voilà qui est intéressant, mais je suis à la recherche d'une solution côté serveur. Je ne jailbreak pas mon iPhone, et je suis curieux de voir quelles erreurs j'ai faites dans mon PHP ou mon approche générale pour résoudre le problème. – Anthony

+0

Je suggère de mettre en place un service qui parle avec Twitter avec OAuth, et le client mobile parlera avec le proxy avec Basic Auth, c'est la manière facile. Et puisque vous recevez une erreur de signature dans votre code, cela devrait être le cas lorsque vous ne retransmettez pas tous les en-têtes spéciaux utilisés par Twitter pour l'authentification. – overboming

Questions connexes