Я бьюсь головой об эту проблему уже почти два дня, и я надеюсь, что кто-то на этом сайте может мне помочь.
Я живу в Китае, и у меня есть сервер (виртуальный хостинг), расположенный в Гонконге. Я настроил прокси-сервер PHP Twitter на сервере и подключаюсь к прокси-серверу с помощью Twitter для iPhone (AKA Tweetie). Это прекрасно работало в прошлом году или около того.
Twitter для iPhone был обновлен вчера и теперь требует авторизации XAuth для подключения к twitter.com (ранее использовалась базовая аутентификация). После обновления я не смог аутентифицировать себя с помощью своего прокси, несмотря на внесение (как мне кажется) соответствующих изменений в мой прокси.
Концептуально решить эту проблему не так уж и сложно. Чтобы пройти аутентификацию на twitter.com с помощью XAuth, приложение должно отправить запрос 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 для копирования заголовка Auth в переменную $_REQUEST, используя этот код:
RewriteCond %{HTTP:Authorization} ^OAuth.*
RewriteRule (.*) index.php?OAuth=%{HTTP:Authorization} [QSA,L]
Мой прокси копирует содержимое этой переменной $_REQUEST в переменную экземпляра с именем $self->oauthHeader. Затем я добавляю его в качестве заголовка к моему запросу cURL, используя следующий код:
if (isset($this->oauthHeader)) {
$headers[] = 'Authorization: '.$this->oauthHeader;
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
$curl_options[CURLOPT_HTTPHEADER] = $headers;
}
Я также добавляю тело POST исходного запроса в тело POST cURL, используя:
$curl_options[CURLOPT_POST] = true;
$curl_options[CURLOPT_POSTFIELDS] = @file_get_contents("php://input");
Я отправляю запрос cURL в Twitter. Кажется, все работает правильно, но я неизбежно получаю ответ «Не удалось проверить подпись и токен oauth».
Я на пределе рассудка, и я не могу хоть убей подумать, что я делаю не так. Любая помощь приветствуется.