Запрос маркера доступа к каналу Twitter ведет себя по-разному на двух серверах

Я должен реализовать метод токена доступа к каналу oAuth2 для твиттера. Я правильно следил за подробностями на сайте твиттера, но я получаю сообщение "Невозможно подтвердить свои учетные данные, твиттер"...

Если я копирую свои учетные данные на свой сервер dev (машина 5.3.10), я могу фактически войти в систему, получить токен, получить твиты, но на сервере другого клиента (машина 5.2.17) я не могу заставить его работать с точно такой же код

В приведенном ниже коде есть что-нибудь о разнице в PHP? Я полагаю, что это должно быть связано с параметрами обертки потока https file_get_content, но я не могу найти ничего в документе об этом. (Поддержка Openssl установлена ​​на клиентском сервере)

$twitter_bearer_access_token = get_option('twitter_bearer_access_token', null);
if($twitter_bearer_access_token == null)
{

    //Request a bearer access token
    $encodedAccessToken = base64_encode(TWITTER_CONSUMER_KEY.':'.TWITTER_CONSUMER_SECRET);

    //Setup the stream context options and create the stream to POST to twitter
    $options = array(
        'http' => array(
            'method' => 'POST',
            'header' => 'Authorization: Basic '.$encodedAccessToken,
            'content' => 'grant_type=client_credentials',
        ),
    );
    $context  = stream_context_create($options);
    $result = json_decode(@file_get_contents('https://api.twitter.com/oauth2/token', false, $context));
    if(isset($result->token_type) && $result->token_type == 'bearer')
    {
        $twitter_bearer_access_token = $result->access_token;
        update_option('twitter_bearer_access_token', $twitter_bearer_access_token);
    }
    else
    {
        $twitter_bearer_access_token = false;
    }

}

Правка № 1

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

Кроме того, я попытался скопировать токен доступа на предъявителя, полученный на сервере 5.3, на сервер 5.2, и значения все еще совпадают, но я продолжаю получать ошибки о недопустимой аутентификации...

Редактировать № 2

Больше информации, похоже, это не имеет никакого отношения к отправляемым мной заголовкам, я добавил практически все заголовки, кроме тех, которые мне не принадлежат, таких как заголовок прокси. Он не имеет ничего общего с PHP, являющимся 5.2 или 5.3, протестированным на хосте нашего промежуточного сервера и переключающимся на 5.2, и все еще работает...

1 ответ

Решение

Кажется, что использование cURL работает нормально. Учитывая, что мы хотим ограничить наши зависимости, нам просто придется прибегнуть к двум версиям кода (или в конечном итоге использовать заменяемый компонент для извлечения удаленных данных)

//Init curl
$request = curl_init();
curl_setopt($request, CURLOPT_SSLVERSION, 3);
curl_setopt($request, CURLOPT_URL, 'https://api.twitter.com/1.1/statuses/user_timeline.json?screen_name='.TWITTER_ACCOUNT.'&count=100');
curl_setopt($request, CURLOPT_HTTPHEADER, array('Authorization: Bearer '.$twitter_bearer_access_token));
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);

$result = json_decode($content = curl_exec($request));
curl_close($request);

Вот и все

PS: По-прежнему нет никаких причин для этого, это всего лишь запасной вариант!

Другие вопросы по тегам