web-dev-qa-db-fra.com

Comment étendre la validité du jeton d'accès depuis la dépréciation de offline_access

Étant donné que le offline_accessPermission est déconseillé dans le flux Authentication de Facebook, nous avons du mal à obtenir les soi-disant jetons d'accès à longue durée de vie sans cette autorisation.

Dans document de Facebook sur la dépréciation il est dit que ce côté serveur OAuth les jetons d'accès générés seront de longue durée, mais ils ne le sont pas.

Suis-je en train de manquer quelque chose? Certains paramètres dans les paramètres de l'application? Quel code spécial dois-je utiliser pour prolonger le délai d'expiration des jetons d'accès? Si je comprends bien la documentation, pour l'authentification côté serveur, le jeton d'accès auquel on peut accéder par la méthode getAccessToken() de PHP SDK lorsque l'utilisateur est connecté est de longue durée.

60
Rok Dominko

Modifier (14 août 2012):
Il y a une semaine, le Facebook officiel PHP SDK a été mis à jour. Le nom de la fonction a été changé en setExtendedAccessToken, et il a été décidé que nous devions réellement détruisez la session par la suite, pour éliminer le risque d'avoir deux sessions actives.
De plus, la fonction ne renvoie plus réellement le jeton, mais le stocke à la place dans les données persistantes. Vous pouvez donc obtenir le nouveau jeton d'accès avec la fonction publique getAccessToken par la suite. Prenez le nouveau SDK depuis Facebook officiel PHP page github du SDK pour vous assurer que vous êtes à jour.

Réponse originale:

J'ai ajouté une nouvelle fonction publique au fichier base_facebook.php, qui renvoie un nouveau jeton d'accès qui expire dans 60 jours. Vous pouvez faire une demande à cette fonction après avoir reçu le jeton d'accès normal. Je n'ai pas testé, mais je suppose que vous devez également activer "obsolète offline_access" dans vos paramètres avancés de l'application développeur.

Ajoutez simplement ceci à votre base_facebook.php dans la classe facebook et appelez-le. Ça marche pour moi.

 public function getExtendedAccessToken(){

    try {
        // need to circumvent json_decode by calling _oauthRequest
          // directly, since response isn't JSON format.
        $access_token_response =
            $this->_oauthRequest(
                $this->getUrl('graph', '/oauth/access_token'), array(
                    'client_id' => $this->getAppId(),
                    'client_secret' => $this->getAppSecret(),
                    'grant_type'=>'fb_exchange_token',
                    'fb_exchange_token'=>$this->getAccessToken()
                )
            );
    } catch (FacebookApiException $e) {
      // most likely that user very recently revoked authorization.
      // In any event, we don't have an access token, so say so.
      return false;
    }

    if (empty($access_token_response)) {
      return false;
    }

    $response_params = array();
    parse_str($access_token_response, $response_params);
    if (!isset($response_params['access_token'])) {
      return false;
    }

    return $response_params['access_token'];
}
72
Marc Hoogvliet

En fait, ce qui a été dit:

Si access_token est généré à partir d'un appel côté serveur OAuth, le access_token résultant aura le temps d'expiration le plus long ). Si l'appel est effectué alors qu'il existe encore un access_token valide pour cet utilisateur, le access_token renvoyé de ce deuxième appel restera le même et seul le délai d'expiration sera prolongé. le premier appel prolongeant le délai d'expiration.

Ce qui signifie qu'il sera juste plus long que le jeton généré côté client, et pour recevoir un jeton étendu (60 jours), vous devez le faire manuellement en émettant une demande à:

https://graph.facebook.com/oauth/access_token?             
    client_id=APP_ID&
    client_secret=APP_SECRET&
    grant_type=fb_exchange_token&
    fb_exchange_token=EXISTING_ACCESS_TOKEN

Ce jeton peut toujours devenir invalide pour plusieurs raisons, et comment gérer cela décrit dans How-To: Handle expired access tokens blog.

Mise à jour:
À partir du 7 août 2012 vous pouvez utiliser la méthode setExtendedAccessToken pour étendre access_token au lieu de construire manuellement l'URL et de récupérer les détails.

22
Juicy Scripter

// en utilisant un javascript pour popup pour la connexion facebook

FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;

// a accesstoken avec 1-2 heures d'expiration

// a accesstoken dans un contrôleur appelé contrôleur facebook

        $request = $this->getRequest();
        $params = $request->getParams();
        $token=$params['accessToken'];

// prendre le jeton d'accès pour s'étendre à 60 jours

        $conf = $this->getConfigs();
        $appid = $conf['fbdetails']['appid'];
        $secret = $conf['fbdetails']['secret'];
        $baseurl = $conf['app']['baseurl'];

// Après l'exécution du code ci-dessous, nous aurons une réponse avec un délai d'expiration du jeton d'accès à 60 jours.

        $token_url = "https://graph.facebook.com/oauth/access_token?client_id=".$appid."&client_secret=".$secret."&grant_type=fb_exchange_token&fb_exchange_token=".$token;

// La réponse ci-dessus est donnée pour l'analyse.

        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($c, CURLOPT_URL, $token_url);
        $contents = curl_exec($c);
        $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
        curl_close($c);

        $paramsfb = null;
        parse_str($contents, $paramsfb);

// après l'analyse du contenu dans le code d'exécution ci-dessus, le nouveau jeton d'accès étendu est stocké.

        $user_session = new Zend_Session_Namespace('fbuser');
        $user_session->access_token = $paramsfb['access_token'];

// stocké dans la session.

        $this->_redirect('/home');

// Avoir un bon codage

10
gokul bs

Un jeton d'accès généré via un appel côté serveur OAuth sera de type étendu (plus long) et vous n'avez pas besoin de l'échanger. Il s'agit déjà d'un jeton étendu. La seule chose que vous que vous devez faire est d'activer "Déprécier l'accès hors ligne" dans les paramètres de votre application. Cela n'est bien sûr nécessaire que si "Déprécier l'accès hors ligne" était précédemment désactivé.

Ensuite, lorsque vous authentifiez les utilisateurs via Facebook, vous recevrez un jeton d'accès qui dure 60 jours. L'authentification à plusieurs reprises au cours de la même journée entraînera uniquement la première authentification prolongeant le délai d'expiration.

3
Robert Kajic

Si vous avez besoin d'un jeton d'accès qui [~ # ~] n'expire jamais [~ # ~] expire pour un [~ # ~] page [~ # ~] , voir ma réponse à une question similaire ici

Depuis la page des développeurs:

En utilisant un jeton d'accès utilisateur longue durée, l'interrogation du point de terminaison [ID utilisateur]/comptes fournira désormais des jetons d'accès à la page qui n'expirent pas pour les pages qu'un utilisateur gère.

2
Pete

Inspiré par les réponses précédentes, j'ai écrit un programme d'auto-renouvellement de jetons simple. Tout d'abord, placez simplement votre jeton actuel dans le fichier 'token.sec'.

Ce programme lira un jeton du fichier et mettra à jour avec un nouveau jeton si tout est OK. Dans d'autres programmes, il vous suffit d'utiliser le jeton:

$access_token = file_get_contents("token.sec");

Nous voilà:

<?php
$app_id = "<your app id>";
$app_secret = "<your app secret>";
$access_token = file_get_contents("token.sec");

$token_url="https://graph.facebook.com/oauth/access_token?"
   . "grant_type=fb_exchange_token"
   . "&client_id=" . $app_id 
   . "&client_secret=" . $app_secret
   . "&fb_exchange_token=" . $access_token;

$ch = curl_init($token_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch); 
if($response === false) {
    die ('Curl error: ' . curl_error($ch));
}

// Close handle
curl_close($ch);

// parse the output
parse_str($response, $params);
if(!isset($params['access_token'])) {
    die("No access token");
}

echo ("New token: $access_token\n");

// eveything looks OK
rename("token.sec", "token.sec.back"); // just in case
$myfile = fopen("token.sec", "w") or die("Unable to open file!");
fwrite($myfile, $access_token);
fclose($myfile);
?>

Enfin, nous pouvons ajouter ceci dans notre crontab pour renouveler le jeton une fois par mois:

0 0 1 * * cd /home/<path>; php exchangeToken.php
0
Sung Kim

il s'agit d'étendre le jeton d'accès aux pages pour qu'il n'expire jamais, et de prolonger la durée de vie des jetons d'accès utilisateur expirant après 2 mois (le "nouveau jeton d'accès").

D'accord, cela a pris environ une semaine de recherche, mais voici ma solution. dans le https://developers.facebook.com/tools/Explorer/ assurez-vous que vous avez manage_page dans le cadre de votre access_token. après cela, utilisez ce code avec votre identifiant d'application, votre secret et votre redirection:

<?php
   app_id = "APP_ID";
   $app_secret = "APP_SECERET";
   $post_login_url = "REDIRECT_URL";


   $code = $_REQUEST['code'];

   //Obtain the access_token with publish_stream permission 
   if(empty($code)){ 
      $dialog_url= "http://www.facebook.com/dialog/oauth?"
       . "client_id=" .  $app_id 
       . "&redirect_uri=" . urlencode( $post_login_url)
       .  "&COMMA_SEPARATED_LIST_OF_PERMISSION_NAMES";
      echo("<script>top.location.href='" . $dialog_url 
      . "'</script>");
     }
    else {


      $token_url="https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id 
       . "&redirect_uri=". urlencode($post_login_url)
       . "&client_secret=" . $app_secret
       . "&code=" . $code;
      $response = file_get_contents($token_url);
      $params = null;
      parse_str($response, $params);
      $access_token = $params['access_token'];
      echo 'access token: ' . $access_token.'<br>';

        if($access_token){


          $token_url="https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id 
       . "&redirect_uri=". urlencode($post_login_url)
       . "&client_secret=" . $app_secret
       .'&grant_type=fb_exchange_token'
       . "&fb_exchange_token=" . $access_token;
       $response = file_get_contents($token_url);
       $access_token = $params['access_token'];
       echo 'new access token: '.$access_token;

        }
    }*/

?>

Après cela, copiez le `` nouveau jeton d'accès '' et revenez à https://developers.facebook.com/tools/Explorer/ Lorsque vous y arrivez dans votre nouveau jeton d'accès dans le champ du jeton d'accès . Cliquez ensuite sur soumettre. Après cela, dans le nœud, vous verrez un + _ ___ cliquez dessus et faites défiler les comptes et cliquez cette. recherchez la page pour laquelle vous avez besoin du jeton d'accès et copiez-le et collez-le dans le champ de la clé d'accès. cliquez sur déboguer et vous verrez qu'il n'expirera jamais. enregistrez ce jeton, il restera valide tant que vous ne réinitialisez pas le secret de vos applications.

0
Aaron Dartt