web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier si le jeton d'accès à Facebook est toujours valide?

Mon site utilise des jetons d'accès à vie (offline_access). Toutefois, si l'utilisateur modifie son mot de passe, le jeton d'accès est réinitialisé. Existe-t-il une méthode pour vérifier si le jeton d'accès actuel est valide avant d'appeler l'API Graph? Merci pour votre temps.

71
axsuul

Fondamentalement, FB veut que vous le recherchiez, ou que vous détectiez le cas et redirigeiez l'utilisateur pour obtenir une nouvelle authentification. Ennuyeux, mais officiel:

(ancien lien obsolète. Voir ci-dessous) https://developers.facebook.com/blog/post/500/

Edit: Facebook a modifié la structure de ses liens sans redirections. Pas surpris.

https://developers.facebook.com/blog/post/2011/05/13/how-to--handle-expired-access-tokens/

37
Otto

Hors ligne, sans rien envoyer à facebook - je ne le pense pas. Le moyen le plus simple est probablement d’envoyer une demande à:

https://graph.facebook.com/me?access_token=...

Facebook prend également en charge les abonnements aux mises à jour de temps réel , mais je ne sais pas comment les appliquer à cette situation.

69
serg

Si vous souhaitez connaître l'heure d'expiration du jeton, vous pouvez transmettre une URL de graphique ouverte à l'aide d'appid et d'un jeton, comme indiqué ci-dessous.

https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token=xxxxxxxxx
43
Chaitanya Bharat
7
Avi Kapuya

Les mises à jour en temps réel vous permettraient de résoudre ce problème, mais ce serait assez compliqué. Fondamentalement, vous pouvez vous abonner à des mises à jour qui vous indiqueront 1) si l'utilisateur a supprimé l'application ou 2) si l'utilisateur a supprimé les autorisations. Vous pouvez l'utiliser pour stocker les autorisations actuelles de l'utilisateur Faceboook. Ainsi, si l'utilisateur supprimait votre application, vous saurez que le jeton d'accès a expiré.

Les mises à jour en temps réel sont en fait le moyen recommandé par Facebook pour gérer les autorisations. De nombreuses applications effectuent des appels api chaque fois qu'une page est chargée pour vérifier les autorisations. Cela a tendance à être lent et peu fiable.

4
Nathan Totten
        //When user access token expires user must be logged in and renew the access token him self.it is a Facebook policy 
        //you can overcome this by sending email to users who have expired access token.
        //create a table of successful sending to monitor sending process
        //if any failure happened with the user an email is sent to him to ask him to activate there account again.with a link to your subscription page.
        //and here is the code should be written on that page. 
         $app_id = "YOUR_APP_ID";
         $app_secret = "YOUR_APP_SECRET"; 
         $my_url = "YOUR_POST_LOGIN_URL";

        // known valid access token stored in a database 
        $access_token = "YOUR_STORED_ACCESS_TOKEN";

        $code = $_REQUEST["code"];

       // If we get a code, it means that we have re-authed the user 
       //and can get a valid access_token. 
       if (isset($code)) {
         $token_url="https://graph.facebook.com/oauth/access_token?client_id="
           . $app_id . "&redirect_uri=" . urlencode($my_url) 
           . "&client_secret=" . $app_secret 
           . "&code=" . $code . "&display=popup";
         $response = file_get_contents($token_url);
         $params = null;
         parse_str($response, $params);
         $access_token = $params['access_token'];
       }


       // Attempt to query the graph:
       $graph_url = "https://graph.facebook.com/me?"
         . "access_token=" . $access_token;
       $response = curl_get_file_contents($graph_url);
       $decoded_response = json_decode($response);

       //Check for errors 
       if ($decoded_response->error) {
       // check to see if this is an oAuth error:
         if ($decoded_response->error->type== "OAuthException") {
           // Retrieving a valid access token. 
           $dialog_url= "https://www.facebook.com/dialog/oauth?"
             . "client_id=" . $app_id 
             . "&redirect_uri=" . urlencode($my_url);
           echo("<script> top.location.href='" . $dialog_url 
          . "'</script>");
        }
        else {
          echo "other error has happened";
        }
      } 
      else {
      // success
        echo("success" . $decoded_response->name);
        echo($access_token);
      }

      // note this wrapper function exists in order to circumvent PHP's 
      //strict obeying of HTTP error codes.  In this case, Facebook 
      //returns error code 400 which PHP obeys and wipes out 
      //the response.
      function curl_get_file_contents($URL) {
        $c = curl_init();
        curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($c, CURLOPT_URL, $URL);
        $contents = curl_exec($c);
        $err  = curl_getinfo($c,CURLINFO_HTTP_CODE);
        curl_close($c);
        if ($contents) return $contents;
        else return FALSE;
      }
1
ashraf mohammed

Hors ligne - ce n'est pas possible

Demander à cet utilisateur de donner ou non l'autorisation:

https://graph.facebook.com/{facebook-id}/permissions?access_token={access-token}

Si le jeton d'accès n'est pas valide, cela générera une erreur:

{  
   error:{  
      message:"The access token could not be decrypted",
      type:"OAuthException",
      code:190
   }
}

Sinon, il donnera la liste des permissions que l'utilisateur a données:

data:[  
   {  
      installed:1,
      ...... permission list......... 
      bookmarked:1
   }
]
1
Hitesh Modha

J'ai parcouru ces posts, mais j'ai trouvé de très bonnes solutions comme celle-ci:

GET graph.facebook.com/debug_token?
    input_token={token-to-inspect}
    &access_token={app_id}|{app_secret}

La réponse à cette demande vous fournit tout ce dont vous avez besoin:

  • votre identifiant d'application - ceci vérifie que le jeton provient de votre application
  • nom de l'application - qui peut également être vérifié
  • expires_at - heure d'expiration du jeton
  • is_valid - Booléen pour vérification
  • ser_id - que vous pouvez également comparer et vérifier

Notez juste que "|" le signe doit être là comme une lettre

1
Pavol Golias

Mise à jour car les choses ont changé depuis OP:

Vous pouvez déboguer les jetons d'accès ici: https://developers.facebook.com/tools/debug/accesstoken?version=v2.5&q= {access_token}

0
Kevin Cantwell