2013-01-24 23 views
16

Sto utilizzando Twitter per accedere utenti a un sito Web, che sembra funzionare fino a quando non tento di ottenere un token di accesso valido.Perché il mio token di accesso di twitter oauth non è valido/scaduto

require("twitteroauth.php"); 
require 'twconfig.php'; 
session_start(); 

$twitteroauth = new TwitterOAuth(YOUR_CONSUMER_KEY, YOUR_CONSUMER_SECRET); 
$request_token = $twitteroauth->getRequestToken('http://****/tw_response.php'); 

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

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

if ($twitteroauth->http_code == 200) { 
    url = $twitteroauth->getAuthorizeURL($request_token['oauth_token']); 
    header('Location: '.$url); 
} else { 
    die('Something wrong happened.'); 
} 

Questo sembra funzionare correttamente, mi reindirizzamento a Twitter per accedere e confermare l'accesso, dopo di che mi torna alla tw_response.php (il mio richiamata url), con le seguenti variabili nella url:

http://example.com/login.php?oauth_token=sO3X...yj0k&oauth_verifier=Ip6T...gALQ 

In tw_response.php, quindi, provo ad ottenere il token di accesso, ma viene segnalato come non valido. Ho provato ad utilizzare var_dump per visualizzare il contenuto del token di accesso come segue:

require("twitteroauth.php"); 
require 'twconfig.php'; 
session_start(); 

$oauth_verifier = $_REQUEST['oauth_verifier']; 
$oauth_token = $_SESSION['oauth_token']; 
$oauth_token_secret = $_SESSION['oauth_token_secret']; 

$twitteroauth = new TwitterOAuth(YOUR_CONSUMER_KEY, YOUR_CONSUMER_SECRET, $oauth_token, $oauth_token_secret); 

$access_token = $twitteroauth->getAccessToken($data['oauth_verifier']); 
var_dump($access_token); 

Il risultato della var_dump termina in "non valido/scaduto Token":

array(8) { 
    ["oauth_url"] => string(104) ""1.0" encoding="UTF-8"?>/oauth/access_token?oauth_consumer_key=ceE...9Dg" 
    ["oauth_nonce"]=> string(32) "c52...d07" 
    ["oauth_signature"]=> string(28) "ry7...Fcc=" 
    ["oauth_signature_method"]=> string(9) "HMAC-SHA1" 
    ["oauth_timestamp"]=> string(10) "1359031586" 
    ["oauth_token"]=> string(40) "sO3...j0k" 
    ["oauth_verifier"]=> string(43) "Ip6...ALQ" 
    ["oauth_version"]=> string(63) "1.0 Invalid/expired Token " 
} 
+0

questo è usando la libreria Abraham Williams'? Sembra che 'getAccessToken (code)' funzioni solo quando la pagina che chiamate fornisce all'utente un codice da digitare dopo aver consentito l'accesso. Penso che tu debba usare entrambe le informazioni quando usi callback-url. – NoBugs

+0

Se si utilizza l'URL di richiamata valido, non è necessario verificare 'oauth_verifier' con le proprie credenziali. verificarlo comunque. – Amelia

+0

L'orologio del server funziona correttamente? –

risposta

17
$access_token = $twitteroauth->getAccessToken($data['oauth_verifier']); 
var_dump($access_token); 

Dove ha fatto $data magicamente vieni? Hai la variabile $oauth_verifier, ma tieni presente che non è necessario se questo è l'URL di richiamata registrato.

Poiché è stata utilizzata una variabile non valida all'interno di getAccessToken, verrà restituito un valore non valido.

Il modo corretto di utilizzare TwitterOAuth:

if (!isset($_GET["oauth_token"])) { 
    // set these values in a config file somewhere. 
    $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET); 

    // append a ?. This is your callback URL if you specify something. 
    $credentials = $twitter->getRequestToken("http://example.com/test.php?"); 

    // try and be a bit more elegant with the URL... This is a minimal example 
    $url = $twitter->getAuthorizeUrl($credentials); 
    echo $url; 

    // these are temporary tokens that must be used to fetch the new, 
    // permanent access tokens. store these in some way, 
    // session is a decent choice. 
    $_SESSION["token"] = $credentials["oauth_token"]; 
    $_SESSION["secret"] = $credentials["oauth_token_secret"]; 
} else { 

    // use the user's previously stored temporary credentials here 
    $twitter = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, 
        $_SESSION["token"], $_SESSION["secret"]); 

    // uses the oauth_token (from the request) already. 
    // you store these credentials in your database (see below). 
    $credentials = $twitter->getAccessToken($_GET["oauth_verifier"]); 

    // just a printout of credentials. store these, don't display them. 
    echo "<pre>"; 
    var_dump($credentials); 
    // valid credentials, provided you give the app access to them. 
    echo "</pre>"; 
} 

mi basta usare un unico script per callback per la facilità d'uso; puoi dividere le sezioni pertinenti in più script, se lo desideri (e probabilmente dovresti farlo).

Facilmente per il tuo database, le credenziali includono anche il nome utente dell'utente twitter.
Modifica: Twitter is now allocating 64bit integers for user IDs. Si dovrebbe archiviare questo come una stringa per assicurarsi di non finire con ID utente e collisioni manomessi se non si è in grado di gestire interi a 64 bit in ogni parte della propria applicazione.

array(4) { 
    ["oauth_token"]=> 
    string(50) "7041...wYupkS" 
    ["oauth_token_secret"]=> 
    string(42) "O9ENq...21B2fk" 
    ["user_id"]=> // user ID. always the same, never changes (store this as ID) 
    string(9) "..." 
    ["screen_name"]=> // username. can change. 
    string(11) "..." 
} 

Quindi, se si desidera accedere gli utenti attraverso Twitter, senza esplicitamente dando loro un accesso al tuo sito, è possibile utilizzare $_SESSION (io uso i database per i miei account di accesso, che è consigliato se si vuole salvare quella stato) Nello script precedente si dovrebbe aggiungere questo alla fine del else blocco:

$_SESSION["token"] = $credentials["oauth_token"]; 
$_SESSION["secret"] = $credentials["oauth_secret"]; 
$_SESSION["username"] = $credentials["screen_name"]; 

È anche possibile ottenere il nome schermo dell'utente e altre offerte GET account/verify_credentials, se si vuole dare loro una pagina utente (se usate javascript, prendete il loro userid tramite id_str qui):

$user_array = $twitter->get("account/verify_credentials"); 
+0

+1 bella soluzione Hiroto! Ma come possiamo ottenere l'email dell'utente? – Arash

+0

Le email degli utenti di @Arash sono private; dovresti invece memorizzare l'ID dell'utente. Contattare un utente con notifiche e-mail richiederebbe loro di inviarti la sua e-mail con il suo esplicito consenso (inserendolo in un modulo) – Amelia

+0

@ Amelia Quando eseguo un 'var_dump ($ credentials)', ottengo un altro elemento in array: ' ["x_auth_expires"] => string (1) "0" '. Penso che questa sia la ragione per cui mi ha dato un token 'invalid/expired'. Puoi dirmi come risolvere questo? –

0

Se il flusso di OAuth stava lavorando un giorno e in mancanza di quello successivo, controllare orologio del computer.Stavo eseguendo una scatola di Vagrant che in qualche modo aveva il suo tempo impostato il giorno prima, che ha causato all'API di Twitter di restituire {"codice": 89, "messaggio": "Token non valido o scaduto."}. Questo può anche apparire come data/ora fuori limite 401. È possibile utilizzare questo comando per aggiornare il vostro orologio in Ubuntu:

sudo ntpdate time.nist.gov 

Alternative method se ntpdate non è disponibile sul sistema:

sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z" 
Problemi correlati