PHP-прокси Twitter, поддерживающий XAuth на сервере Apache

Я бьюсь головой об эту проблему уже почти два дня, и я надеюсь, что кто-то на этом сайте может мне помочь.

Я живу в Китае, и у меня есть сервер (виртуальный хостинг), расположенный в Гонконге. Я настроил прокси-сервер 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».

Я на пределе рассудка, и я не могу хоть убей подумать, что я делаю не так. Любая помощь приветствуется.


person Anthony    schedule 28.06.2010    source источник


Ответы (1)


Вы можете использовать это альтернативное решение только для взломанных устройств iOS: http://code.google.com/p/gfwinterceptor/

person overboming    schedule 23.07.2010
comment
Это интересно, но я ищу серверное решение. Я не взламываю свой iPhone, и мне любопытно посмотреть, какие ошибки я допустил либо в моем PHP, либо в моем общем подходе к решению проблемы. - person Anthony; 28.07.2010
comment
Я предлагаю настроить службу, которая общается с Twitter с помощью OAuth, а мобильный клиент будет общаться с прокси-сервером с базовой аутентификацией, это самый простой способ. И поскольку вы получаете ошибку подписи в своем коде, это должно быть так, что вы на самом деле не пересылаете все специальные заголовки, которые Twitter использует для аутентификации. - person overboming; 28.07.2010