60 votes

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

Depuis l' offline_access Autorisation est supprimée de la version Facebook de l' Authentification des flux, nous avons problème de geting dits de longue durée de vie des jetons d'accès sans autorisation.

Dans Facebook du document sur la désapprobation dit-il, que côté serveur OAuth généré des jetons d'accès va être de longue durée, mais ils ne le sont pas.

Ai-je raté quelque chose? Quelques réglages dans les paramètres de l'application? Certains code que j'ai besoin d'utiliser de prolonger le temps d'expiration de jetons d'accès? Ce que je comprends de la documentation, pour l'authentification côté serveur, le jeton d'accès qui peut être consulté par getAccessToken() méthode de SDK PHP lorsque l'utilisateur est connecté, a longtemps vécu.

72voto

Marc Hoogvliet Points 920

Edit (14 août 2012):
Il y a une semaine officielle Facebook PHP SDK a été mis à jour. Le nom de la fonction a été modifiée pour setExtendedAccessToken, et il a été décidé que nous avions vraiment besoin de détruire la session par la suite, pour supprimer le risque d'avoir deux sessions actives.
Aussi, la fonction n'est plus réellement retourne le jeton, mais au lieu stocke dans le persistant de données. Vous pouvez donc obtenir le nouveau jeton d'accès à la fonction publique getAccessToken par la suite. Saisir le nouveau kit de développement officiel Facebook SDK PHP github page pour vous assurer que vous êtes jusqu'à ce jour.

Réponse Originale À Cette Question:

J'ai ajouté une nouvelle fonction publique de l'base_facebook.php fichier, qui retourne un nouveau jeton d'accès qui expire dans 60 jours. Vous pouvez faire une demande pour cette fonction après que vous avez reçu la normale jeton d'accès. Je n'ai pas testé, mais je suppose que vous devez également activer l'option "rendre caduque offline_access" dans les paramètres Avancés de l'Application de développement.

Juste ajouter ceci à votre base_facebook.php à l'intérieur de l'facebook de la classe et de faire un appel. 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'];
}

22voto

Juicy Scripter Points 16091

En fait ce qui a été dit:

Si l'access_token est généré à partir d'un serveur d'authentification OAuth appel, la access_token aura plus le temps d'expiration. Si l'appel est effectué alors qu'il est encore valide access_token de l'utilisateur, le retour de l'access_token de ce deuxième appel restera la même et que le délai d'expiration sera étendu. Encore une fois, l'appeler plusieurs fois au cours de la même journée aura pour résultat que dans le premier appel d'étendre le délai d'expiration.

Ce qui signifie qu'il sera juste plus long que le côté client jeton généré, et de bénéficier de jeton (60 jours), vous devrez le faire manuellement par l'émission de 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 devenu invalide pour plusieurs raisons, et la façon de gérer cela est décrit dans Comment: Gérer expiré jetons d'accès au blog.

Mise à jour:
Dès Août 07, 2012 vous pouvez utiliser setExtendedAccessToken méthode pour étendre access_token au lieu de saisir manuellement la construction de l'URL et de la récupération des détails.

10voto

gokultvm Points 46

//à l'aide d'un javascript popup pour facebook login

FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;

//la accesstoken avec 1-2 heures le délai d'expiration

//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 de l'étendre à 60jours

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

//Après l'exécution de code ci-dessous , nous aurons une réponse avec accès jeton de la date d'expiration de 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;

// Ci-dessus, la réponse 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);

//une fois l'analyse le contenu ci-dessus exécution de code de la nouvelle étendue accesstoken est stocké.

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

//stocker à la session.

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

//Avoir un joli codage

3voto

Robert Kajic Points 2416

Un jeton d'accès généré par un serveur OAuth appel sera prolongé (plus) genre et que 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 le "Railler l'accès hors connexion" dans les paramètres de votre app. Bien sûr, ceci est uniquement nécessaire en cas de "Déprécier l'accès hors connexion" avait été désactivé.

Ensuite, lorsque vous authentifier les utilisateurs par le biais de Facebook, vous recevrez un jeton d'accès qui vit pendant 60 jours. L'authentification à plusieurs reprises au cours de la même journée aura pour résultat que dans la première authentification de prolonger le délai d'expiration.

2voto

Pete Points 2782

Si vous avez besoin d'un jeton d'accès que JAMAIS à expiration, pour une PAGE, voir ma réponse à une question similaire ici

Par les développeurs de la page:

En utilisant une longue durée de vie jeton d'accès utilisateur, en interrogeant le [Utilisateur ID]/comptes d'extrémité s'occupera désormais de la page des jetons d'accès qui ne sont pas expirer pour les pages que l'utilisateur gère.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X