Comment étendre la validité des tokens d'accès depuis la déprécation d'accès hors ligne

depuis que le offline_access Permission est déprécié dans le authentification flux de Facebook, nous avons le problème geting les soi-disant jetons d'accès de longue durée de vie sans cette permission.

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

est-ce que je manque quelque chose? Certains paramètres dans les paramètres de l'application? Un code spécial que je dois utiliser pour prolonger la durée d'expiration des jetons d'accès? Comme je comprends la documentation, pour l'authentification côté serveur, le jeton d'accès qui peut être accédé par la méthode getAccessToken() du SDK PHP lorsque l'utilisateur est connecté est de longue durée.

59
demandé sur Igy 2012-01-24 08:30:03

7 réponses

Edit (14 août) 2012):

Il y a une semaine, le SDK PHP officiel de Facebook a été mis à jour. Le nom de la fonction a été changé en setExtendedAccessToken , et il a été décidé que nous devions détruire la session après, pour supprimer le risque d'avoir deux sessions actives.

De plus, la fonction ne renvoie plus le token, mais le stocke dans les données persistant. Vous pouvez par conséquent, obtenez le nouveau token d'accès avec la fonction publique getAccessToken après. Saisir le nouveau SDK de officielle Facebook SDK PHP github page pour s'assurer que vous êtes jusqu'à ce jour.

Réponse Originale:

j'ai ajouté une nouvelle fonction publique à base_facebook.fichier php, qui retourne un nouveau jeton d'accès qui expire dans 60 jours. Vous pouvez faire une demande pour cette fonction après avoir reçu le jeton d'accès normal. Je n'ai pas testé, mais je suppose que vous devez aussi activer" deprecate offline_access " dans vos paramètres avancés de L'Application Developer.

ajoutez simplement ceci à votre base_facebook.php à l'intérieur de la classe facebook et de faire un appel à elle. Il fonctionne 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
répondu Marc Hoogvliet 2012-08-15 21:08:23

en fait ce qui a été dit:

si l'access_token est généré à partir d'un appel OAuth côté serveur, l'access_token résultant aura le plus long temps d'expiration . Si l'appel est passé alors qu'il y a encore un access_token valide pour cet utilisateur, l'access_token retourné de ce second appel restera le même et seule la durée d'expiration sera prolongée. Encore une fois, appeler plusieurs fois pendant le même jour résultera seulement dans le premier appel d'étendre 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 le jeton prolongé (60 jours) vous devez le faire manuellement en émettant la 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 encore être devenu invalide pour plusieurs raisons, et comment gérer cela décrit dans Comment-faire: Gérer les jetons d'accès expirés post de blog.

mise à jour:

À partir de Aug 07, 2012 vous pouvez utiliser setExtendedAccessToken méthode pour étendre access_token au lieu de construire manuellement L'URL et extraire des détails.

21
répondu Juicy Scripter 2012-09-08 17:22:38

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

FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;

//obtenu la accesstoken avec 1-2 heures heure d'expiration

//obtenu la accesstoken dans un contrôleur nommé facebook contrôleur

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

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

        $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 le temps d'expiration du token acess à 60jours.

        $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 extensible accessstoken est stocké.

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

/ / stocké jusqu'à la session.

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

//Avoir un joli codage

10
répondu gokultvm 2012-07-18 22:40:44

un jeton d'accès généré par un appel OAuth côté serveur sera du type étendu (plus long) et vous n'avez pas besoin de l'échanger. C'est déjà une longue jeton. La seule chose que vous devez faire est d'activer l ' "accès hors ligne déprécié" dans les paramètres de votre application. Cela n'est évidemment nécessaire que si "L'accès hors ligne déprécié" était préalablement désactivé.

ensuite, lorsque vous authentifiez des utilisateurs via Facebook, vous recevrez un token d'accès qui durera 60 jours. L'authentification à plusieurs reprises au cours d'une même journée ne donnera lieu qu'à une première authentification prolongeant le délai d'expiration.

3
répondu Robert Kajic 2012-04-04 16:17:30

si vous avez besoin d'un token d'accès que jamais expire pour un PAGE , voir ma réponse à une question similaire ici

De la part des développeurs de la page:

en utilisant un jeton d'accès d'utilisateur de longue durée, en interrogeant le [utilisateur ID]/comptes d'extrémité s'occupera désormais de la page jetons d'accès que ne pas expiration pour les pages que l'utilisateur gère.

2
répondu Pete 2017-05-23 11:44:11

ceci est pour étendre le token d'accès de pages à expirer jamais, et prolonger la vie des tokens d'accès d'utilisateur expirant après 2 mois(le 'nouveau token d'accès').

Ok donc ça a pris environ une semaine de recherche mais voici ma solution. dans le https://developers.facebook.com/tools/explorer / assurez-vous que manage_page fait partie de votre access_token. après cela, utilisez ce code avec votre application id, secret, et redirect:

<?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 token d'accès" et retournez à https://developers.facebook.com/tools/explorer / lorsque vous passez dans votre nouveau token d'accès dans le champ du token d'accès. Puis cliquez sur soumettre. Après cela dans le noeud vous verrez un + _ ___ cliquez sur ceci et faites défiler vers le bas jusqu'aux comptes et cliquez sur cela. trouvez la page pour laquelle vous avez besoin du token d'accès et copiez-la et collez-la dans l'accès champ de clé. cliquez sur déboguer et vous verrez qu'il n'expire jamais. enregistrez ce token il restera valide aussi longtemps que vous ne réinitialisez pas vos applications secrètes.

0
répondu Aaron Dartt 2013-04-01 11:15:43

inspiré par les réponses précédentes, j'ai écrit un programme d'auto-renouvellement simple et symbolique. Tout d'abord, mettez votre jeton actuel dans le jeton.sec' fichier.

ce programme Lira un jeton du fichier, et mettra à jour avec un nouveau jeton si tout va bien. Dans d'autres programmes, vous avez juste besoin d'utiliser le jeton:

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

nous sommes ici:

<?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 token une fois par momth:

0 0 1 * * cd /home/<path>; php exchangeToken.php
0
répondu Sung Kim 2016-02-08 04:27:16