twitteroauth tool developer application php twitter twitter-oauth

php - tool - ¿Por qué mi token de acceso a Twitter oauth no es válido/caducó?



twitter token (3)

Creo que este enlace te puede ayudar

http://www.phpgang.com/twitter-oauth-in-php_175.html

Estoy utilizando Twitter para iniciar sesión en un sitio web, que parece estar funcionando hasta que intento obtener un token de acceso válido.

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

Esto parece estar funcionando correctamente, redirigiéndome a Twitter para iniciar sesión y confirmar el acceso, después de lo cual me devuelve a tw_response.php (mi url de devolución de llamada), con las siguientes variables en la url:

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

En tw_response.php, luego trato de obtener el token de acceso, pero se informa como no válido. Intenté usar var_dump para ver el contenido del token de acceso de la siguiente manera:

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

El resultado de var_dump termina en "Token inválido / caducado":

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


Si su flujo de OAuth estuvo funcionando un día y fallando al siguiente, verifique el reloj de su computadora. Estaba ejecutando un buzón Vagrant que, de alguna manera, tenía su hora programada para el día anterior, lo que provocó que la API de Twitter devolviera {"código": 89, "mensaje": "token no válido o caducado". Esto también puede aparecer como 401 marca de tiempo fuera de límites. Puedes usar este comando para actualizar tu reloj en Ubuntu:

sudo ntpdate time.nist.gov

Método alternativo si ntpdate no está disponible en su sistema:

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


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

¿De dónde vino $data mágicamente? Tiene la variable $oauth_verifier , pero tenga en cuenta que no es necesario si esta es su URL de devolución de llamada registrada.

Ya que getAccessToken una variable inválida dentro de getAccessToken , devolverá un valor inválido.

La forma correcta de usar 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>"; }

Solo uso un solo script para las devoluciones de llamada para facilitar su uso; puede dividir las secciones relevantes en múltiples scripts si lo desea (y probablemente debería).

Prácticamente para su base de datos, las credenciales también incluyen el nombre de usuario del usuario de Twitter.
Edición : Twitter ahora está asignando números enteros de 64 bits para las ID de usuario . Debe almacenar esto como una cadena para asegurarse de no terminar con ID de usuario y colisiones mutiladas si no puede manejar enteros de 64 bits en cada parte de su aplicación.

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

Por lo tanto, si desea iniciar sesión en los usuarios a través de Twitter, sin darles un inicio de sesión explícito a su sitio, puede usar $_SESSION (Yo uso bases de datos para mis inicios de sesión, lo que se recomienda si desea guardar ese estado) En la secuencia de comandos anterior Usted agregaría esto al final del bloque else :

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

También puede obtener el nombre de pantalla del usuario y más en GET account/verify_credentials , si desea darles una página de usuario (si usa javascript, id_str su ID de usuario a través de id_str aquí):

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