2016-06-29 6 views
0

Я пытаюсь получить access_token пользователя, который только что дал разрешение на мое приложение Twitter. Когда я вхожу в систему, он работает, но только запоминает мой access_token, пока я не обновляюсь или не нажимаю кнопку.Abraham's TwitterOAuth access_token продолжает исчезать после обновления или нажимает кнопку

код, который я использую:

require(__DIR__ . '/../../lib/data/twitter-login-api/autoload.php'); 
use Abraham\TwitterOAuth\TwitterOAuth; 

$oauth_callback = OAUTH_CALLBACK; 
$consumer_key = OAUTH_KEY; 
$consumer_secret = OAUTH_SECRET; 

//Do something if $_REQUEST occur and previous session is equal to current $_REQUEST 
if (isset($_REQUEST['oauth_token']) && $_SESSION['oauth_token'] === $_REQUEST['oauth_token']) { 

    //Open first connection at callback 
    $connection = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']); 

    //Then verify your token 
    $access_token = $connection->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier'])); 

    //Now you can save them 
    $_SESSION['new_session_for_oauth_token'] = $access_token['oauth_token']; 
    $_SESSION['new_session_for_oauth_token_secret'] = $access_token['oauth_token_secret']; 

    //You may also check it first 
    $connection = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['new_session_for_oauth_token'], $_SESSION['new_session_for_oauth_token_secret']); 
    $check = $connection->get("account/verify_credentials"); 
    $username = $check->name; 

    //To echo your account's stat 
    echo '<p>' . $check->statuses_count . '</p>'; 
    echo '<p>' . $check->friends_count . '</p>'; 
    echo '<p>' . $check->followers_count . '</p>'; 
    echo '<p>' . $check->favourites_count . '</p>'; 

    //And finally unset previous sessions 
    unset($_SESSION['oauth_token']); 
    unset($_SESSION['oauth_token_secret']); 

    //this is the end of callback url 
} else { 

    $connection = new TwitterOAuth($consumer_key, $consumer_secret); 
    $request_token = $connection->oauth('oauth/request_token', array("oauth_callback" => $oauth_callback)); 

    $_SESSION['oauth_token'] = $request_token['oauth_token'];  
    $_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret']; 

    $twitter_url = $connection->url("oauth/authorize", array("oauth_token" => $request_token['oauth_token'])); 
} 

Он регистрирует меня в одно время, и я получаю access_token и access_token_secret, но мне нужно, чтобы они оставались в сессии, с тем, что я могу использовать его после страницы обновить или нажать на кнопку.

Что я делаю неправильно?

ответ

0

Я думал, что это произошло, потому что вы пытались создать соединение без доступа к токенам перед проверкой токена доступа.

В самом начале,

//Open first connection at callback 
$connection = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']); 

//Then verify your token 
$access_token = $connection->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier'])); 

//Now you can save them 
$_SESSION['new_session_for_oauth_token'] = $access_token['oauth_token']; 
$_SESSION['new_session_for_oauth_token_secret'] = $access_token['oauth_token_secret']; 

Еще одна вещь, которую вы должны заметить, что вам нужно unset предыдущего токена (до авторизован), но, конечно, после того, как фаза разрешающее прошло. И здесь, я добавил еще выражение лучше (на мой взгляд), так как у вас есть только одна страница для «запроса» и «Обратный вызов»

//Do something if $_REQUEST occur and previous session is equal to current $_REQUEST 
if (isset($_REQUEST['oauth_token']) && $_SESSION['oauth_token'] === $_REQUEST['oauth_token']) { 

    //Open first connection at callback 
    $connection = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']); 

    //Then verify your token 
    $access_token = $connection->oauth("oauth/access_token", array("oauth_verifier" => $_REQUEST['oauth_verifier'])); 

    //Now we overwrite previouse session with verified one 
    $_SESSION['oauth_token'] = $access_token['oauth_token']; 
    $_SESSION['oauth_token_secret'] = $access_token['oauth_token_secret']; 

    //You may also check it first 
    $connection = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, $_SESSION['new_session_for_oauth_token'], $_SESSION['new_session_for_oauth_token_secret']); 
    $check = $connection->get("account/verify_credentials"); 

    //To echo your account's stat 
    echo $check->statuses_count; 
    echo $check->friends_count; 
    echo $check->followers_count; 
    echo $check->favourites_count; 

    //And finally unset previous sessions 
    unset($_SESSION['oauth_token']); 
    unset($_SESSION['oauth_token_secret']); 

    //this is the end of callback url 
} elseif (isset($_GET['twitter']) && $_GET['twitter'] === 'login') { 
    //Request a token aka login 

    $connection = new TwitterOAuth($consumer_key, $consumer_secret); 
    $request_token = $connection->oauth('oauth/request_token', array("oauth_callback" => $oauth_callback)); 

    $_SESSION['oauth_token'] = $request_token['oauth_token'];  
    $_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret']; 

    $twitter_url = $connection->url("oauth/authorize", array("oauth_token" => $request_token['oauth_token'])); 
} elseif (isset($_GET['twitter']) && $_GET['twitter'] === 'logout') { 
    //Destroy the session aka logout 

    unset($_SESSION['oauth_token']); 
    unset($_SESSION['oauth_token_secret']); 
    $url = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); 
    header("location: {$url}"); 
    exit(); 
} 

//Before or after this snippet is HTML part 

Теперь в вашем HTML-части, если вы собираетесь войти в Twitter , перейдите к example.org/page.php?twitter=login. Вы также можете выполнить регистрацию на example.org/page.php?twitter=logout

+0

Спасибо за ваш быстрый ответ @ Chay22. Я изменил свой код на пример, который вы мне дали. Он регистрирует меня совершенно, но все равно теряет access_token при обновлении страницы. И да, действительно, я использую один файл PHP для обработки логина и обратного вызова. Это возможно? Я редактировал код выше кода, который я использую сейчас. Должен быть способ заставить это работать правильно? – TomHoevenaars

+0

Всегда лучше разделить логику каждого файла, но в этом состоянии это всего лишь вопрос стиля. Как вы повторно использовали сеанс? Просто обновите эту страницу обратного вызова/запроса? Он не будет работать, поскольку (ваша) цель этой страницы - это просто запрашивать и проверять токен. Получите другую страницу, запустите сеанс, создайте новое соединение, дайте мне знать. – Chay22

+0

Ну, если я прав, должен быть способ сохранить этот access_token в сеансе. Файл PHP, который я использую для этого входа в Twitter, включен в файл, где находится мой HTML. Когда я нажимаю на кнопку, она перенаправляет меня на twitter_url, где я должен авторизовать свое приложение. После этого появляется мое имя (потому что я вошел в систему). Я также получаю access_token и access_token_secret. Когда я исправил эту часть, я хочу опубликовать твит от имени этой учетной записи, которая вошла в систему. – TomHoevenaars