2016-06-29 10 views
0

Ich versuche, das access_token eines Benutzers zu erhalten, der meiner twitter-App gerade die Berechtigung erteilt hat. Wenn ich mich anmelde, funktioniert es, merkt sich aber erst mein access_token, bis ich auffrische oder auf eine Schaltfläche klicke.Abrahams TwitterOAuth access_token verschwindet nach der Aktualisierung oder dem Klicken auf die Schaltfläche

Code, ich verwende:

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'])); 
} 

Es protokolliert mich in einer Zeit, und ich erhalte die access_token und access_token_secret aber ich brauche sie in einer Sitzung zu bleiben, damit ich es auch nach einer Seite verwenden kann Aktualisieren oder klicken Sie auf eine Schaltfläche.

Was mache ich falsch?

Antwort

0

Ich dachte, es passiert, weil Sie eine "non-access-tokened" Verbindung vor der Überprüfung des Zugriffstokens instanziiert haben.

Gleich am Anfang,

//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']; 

Eine andere Sache, die Sie bemerken, dass, sollten Sie tun müssen, um unset vorherigen Token (vor autorisiert), aber natürlich nach der Anweisungsphase vergangen ist. Und hier habe ich mehr Ausdruck besser (auf meinen Augen), da Sie nur eine Seite für „Anfrage“ haben und „Rückruf“

//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 

nun in Ihrem HTML-Teil, wenn Sie gehen zu Twitter anmelden , gehen Sie zu example.org/page.php?twitter=login. Sie können auch abmelden von example.org/page.php?twitter=logout

+0

Vielen Dank für Ihre schnelle Antwort @ Chay22. Ich habe meinen Code in das Beispiel geändert, das Sie mir gegeben haben. Es meldet mich perfekt an, aber verliert immer noch den access_token beim Aktualisieren der Seite. Und ja, ich benutze eine PHP-Datei, um den Login und Callback zu handhaben. Das ist möglich, oder? Ich habe den Code oben auf den Code geändert, den ich gerade benutze. Es muss einen Weg geben, um das richtig zu machen? – TomHoevenaars

+0

Es ist immer besser, verschiedene Logiken für jede Datei zu trennen, aber in diesem Zustand ist es nur eine Frage des Stils. Wie hast du die Sitzung wiederverwendet? Aktualisieren Sie einfach diese Rückruf/Anforderungsseite? Es wird nicht funktionieren, da der Zweck dieser Seite nur darin besteht, ein Token anzufordern und zu verifizieren. Holen Sie sich eine andere Seite, starten Sie eine Sitzung, erstellen Sie eine neue Verbindung, lassen Sie es mich wissen. – Chay22

+0

Nun, wenn ich richtig bin, muss es eine Möglichkeit geben, dieses access_token in einer Sitzung zu behalten. Die PHP-Datei, die ich für diesen Twitter-Login verwende, ist in der Datei enthalten, in der sich mein HTML befindet. Wenn ich auf eine Schaltfläche klicke, leite ich mich auf twitter_url um, wo ich meine App autorisieren muss. Danach erscheint mein Name (weil ich eingeloggt bin). Ich erhalte auch das access_token und access_token_secret. Als ich diesen Teil repariert habe, möchte ich einen Tweet im Namen dieses Accounts posten, der eingeloggt ist. – TomHoevenaars