2013-01-24 19 views
16

Używam Twittera do logowania użytkowników do witryny, która wydaje się działać, dopóki nie spróbuję uzyskać prawidłowego tokena dostępu.Dlaczego mój token dostępu do Twittera jest nieważny/nieważny

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

To wydaje się działać poprawnie, przekierowanie mnie do Twittera Aby zalogować się i potwierdzić dostępu, po czym wraca do mnie mój oddzwan tw_response.php (URL), o następujących zmiennych w adresie URL:

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

W tw_response.php Próbuję następnie uzyskać token dostępu, ale jest on nieprawidłowy. Próbowałem za pomocą var_dump aby przeglądać zawartość tokenu dostępu następująco:

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); 

Wynik var_dump kończy się "nieważne/upłynął 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

To jest za pomocą biblioteki Abraham Williamsa? Wygląda na to, że 'getAccessToken (code)' działa tylko wtedy, gdy wywoływana strona daje użytkownikowi kod do wpisania po umożliwieniu dostępu. Myślę, że musisz użyć obu informacji podczas korzystania z URL-a wywołania zwrotnego. – NoBugs

+0

Jeśli używasz poprawnego adresu URL wywołania zwrotnego, nie musisz weryfikować "oauth_verifier" za pomocą poświadczeń. w każdym razie to sprawdzam. – Amelia

+0

Czy zegar serwera działa poprawnie? –

Odpowiedz

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

skąd $data magicznie pochodzić z? Masz zmienną $oauth_verifier, ale pamiętaj, że nie potrzebujesz tego, jeśli jest to zarejestrowany URL wywołania zwrotnego.

Ponieważ użyłeś nieprawidłowej zmiennej wewnątrz getAccessToken, zwróci ona nieprawidłową wartość z powrotem.

Prawidłowy sposób korzystania 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>"; 
} 

wystarczy użyć jednego skryptu do wywołania zwrotne dla łatwości użytkowania; możesz podzielić odpowiednie sekcje na wiele skryptów, jeśli chcesz (i prawdopodobnie powinieneś).

Poręcznie dla Twojej bazy danych, poświadczenia obejmują również nazwę użytkownika twitter użytkownika.
Edytuj: Twitter is now allocating 64bit integers for user IDs. Powinieneś zapisać to jako ciąg, aby upewnić się, że nie skończysz z zniekształconych identyfikatorów użytkowników i kolizji, jeśli nie możesz obsłużyć 64-bitowych liczb całkowitych w każdej części aplikacji.

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) "..." 
} 

Tak więc, jeśli chcesz, aby użytkownicy logują się za pośrednictwem Twittera, bez wyraźnie dając im logowanie do witryny, można użyć $_SESSION (I korzystać z baz danych dla moich loginów, co jest zalecane, jeśli chcesz zapisać, że state) W powyższym skrypcie chcesz dodać to do końca bloku else:

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

można również uzyskać pseudonim użytkownika i więcej od GET account/verify_credentials, jeśli chcesz dać im strony użytkownika (jeśli używasz javascript, chwyć ich userid poprzez id_str tutaj):

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

+1 fajne rozwiązanie Hiroto! Ale jak możemy dostać e-mail użytkownika? – Arash

+0

@Arash e-maile użytkownika są prywatne; zamiast tego należy zapisać identyfikator użytkownika. Kontaktowanie się z użytkownikiem za pomocą powiadomień e-mail wymagałoby od ciebie wysłania e-maila z wyraźną zgodą (poprzez wprowadzenie go do formularza). – Amelia

+0

@Amelia Kiedy robię 'var_dump ($ credentials)', otrzymuję jeszcze jeden element w tablicy: ' ["x_auth_expires"] => ciąg (1) "0" '. Myślę, że to jest powód, dla którego daje mi "nieważny/wygasły token". Czy możesz mi powiedzieć, jak rozwiązać ten problem? –

0

Jeśli przepływ OAuth pracował jeden dzień i braku następnego sprawdzić komputera zegar.Prowadziłem pudełko Włócznika, które w jakiś sposób miało swój czas na dzień wcześniej, co spowodowało, że API Twittera zwróciło {"kod": 89, "wiadomość": "Nieprawidłowy lub wygasły token."}. Może to również pojawić się jako znacznik czasu 401 poza zakresem. Można użyć tego polecenia, aby zaktualizować swój zegar w Ubuntu:

sudo ntpdate time.nist.gov 

Alternative method jeśli ntpdate nie jest dostępna w systemie:

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