web-dev-qa-db-fra.com

Pourquoi mon jeton d'accès Twitter oauth est-il invalide/expiré?

J'utilise Twitter pour connecter les utilisateurs à un site Web, qui semble fonctionner jusqu'à ce que je tente d'obtenir un jeton d'accès valide.

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

Cela semble fonctionner correctement et me redirige vers Twitter pour me connecter et confirmer l'accès, après quoi il me renvoie à tw_response.php (mon URL de rappel), avec les variables suivantes dans l'URL:

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

Dans tw_response.php, j’essaie d’obtenir le jeton d’accès, mais le résultat est non valide. J'ai essayé d'utiliser var_dump pour afficher le contenu du jeton d'accès comme suit:

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

Le résultat du var_dump se termine par "Token invalide/expiré":

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 "
}
16
Finglish
$access_token = $twitteroauth->getAccessToken($data['oauth_verifier']);
var_dump($access_token);

D'où vient $data comme par magie? Vous avez la variable $oauth_verifier, mais gardez à l'esprit que vous n'en avez pas besoin s'il s'agit de votre URL de rappel enregistrée.

Puisque vous avez utilisé une variable non valide dans getAccessToken, elle renverra une valeur non valide.

La bonne façon d'utiliser 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>";
}

Je viens d'utiliser un seul script pour les rappels pour la facilité d'utilisation; vous pouvez diviser les sections pertinentes en plusieurs scripts si vous le souhaitez (et vous devriez probablement le faire).

Facilement pour votre base de données, les informations d'identification incluent également le nom d'utilisateur de l'utilisateur Twitter.
Edit : Twitter alloue maintenant des entiers 64 bits pour les identifiants d’utilisateur . Vous devez stocker ceci en tant que chaîne _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ pour éviter que vous ne perdiez des identifiants d'utilisateur et des conflits si vous ne pouvez pas gérer les entiers 64 bits dans chaque partie de votre application.

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

Ainsi, si vous souhaitez connecter les utilisateurs via Twitter, sans leur donner explicitement de connexion à votre site, vous pouvez utiliser $_SESSION (j'utilise des bases de données pour mes connexions, ce qui est recommandé si vous souhaitez enregistrer cet état) Dans le script ci-dessus, vous ajouteriez ceci à la fin du bloc else:

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

Vous pouvez également obtenir le nom d'écran de l'utilisateur et plus encore de GET account/verify_credentials , si vous souhaitez lui attribuer une page utilisateur (si vous utilisez javascript, saisissez son ID utilisateur via id_str ici):

$user_array = $Twitter->get("account/verify_credentials");
17
Amelia

Je pense que ce lien peut vous aider

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

4
Vandana Pareek

Si votre flux OAuth fonctionnait un jour et échouait le lendemain, vérifiez le clock de votre ordinateur. J'utilisais une boîte Vagrant dont le délai était la veille, ce qui a amené l'API Twitter à retourner {"code": 89, "message": "Jeton non valide ou expiré."}. Cela peut également apparaître comme un horodatage 401 hors limites. Vous pouvez utiliser cette commande pour mettre à jour votre horloge sous Ubuntu:

Sudo ntpdate time.nist.gov

La méthode alternative si ntpdate n'est pas disponible sur votre système:

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