wake-up-neo.net

So verlängern Sie die Gültigkeit des Zugriffstokens seit dem Verfall von offline_access

Da der offline_accessBerechtigung im Authentifizierung -Fluss von Facebook veraltet ist, haben wir Probleme, die sogenannten langlebigen Zugriffstoken ohne diese Berechtigung zu erhalten.

In Facebooks Dokument über die Ablehnung heißt es, dass serverseitig OAuth generierte Zugriffstoken langlebig sind, aber nicht.

Vermisse ich etwas? Einige Einstellungen in den App-Einstellungen? Ein spezieller Code, den ich verwenden muss, um die Ablaufzeit von Zugriffstoken zu verlängern? Soweit ich die Dokumentation verstehe, ist für die serverseitige Authentifizierung das Zugriffstoken, auf das mit der getAccessToken() -Methode von PHP SDK, wenn der Benutzer angemeldet ist, zugegriffen werden kann, langlebig.

60
Rok Dominko

Bearbeiten (14. August 2012):
Vor einer Woche wurde das offizielle Facebook PHP SDK aktualisiert. Der Funktionsname wurde in setExtendedAccessToken geändert Zerstören Sie die Sitzung anschließend, um das Risiko von zwei aktiven Sitzungen zu vermeiden.
Außerdem gibt die Funktion das Token nicht mehr zurück, sondern speichert es in den persistenten Daten. Sie können daher den neuen Zugriffstoken mit der öffentlichen Funktion getAccessToken nachträglich erhalten. Holen Sie sich das neue SDK von offizielle Facebook PHP SDK-Github-Seite , um sicherzustellen, dass Sie auf dem neuesten Stand sind.

Ursprüngliche Antwort:

Ich habe der Datei base_facebook.php eine neue öffentliche Funktion hinzugefügt, die ein neues Zugriffstoken zurückgibt, das nach 60 Tagen abläuft. Sie können diese Funktion anfordern, nachdem Sie das normale Zugriffstoken erhalten haben. Ich habe es nicht getestet, aber ich gehe davon aus, dass Sie in den erweiterten Einstellungen der Entwickler-App auch "Offline-Zugriff nicht mehr zulassen" aktivieren müssen.

Fügen Sie dies einfach Ihrer base_facebook.php in der Facebook-Klasse hinzu und rufen Sie sie an. Für mich geht das.

 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

Eigentlich was gesagt wurde:

Wenn das access_token von einem serverseitigen OAuth) -Aufruf generiert wird, hat das resultierende access_token die längere Ablaufzeit . Wenn der Anruf getätigt wird, während für diesen Benutzer noch ein gültiges access_token vorhanden ist, bleibt das zurückgegebene access_token dieses zweiten Anrufs unverändert, und nur die Ablaufzeit wird verlängert Der erste Anruf verlängert die Ablaufzeit.

Dies bedeutet, dass es nur länger ist als das clientseitig generierte Token. Um ein erweitertes Token (60 Tage) zu erhalten, müssen Sie dies manuell tun, indem Sie eine Anfrage an folgende Adresse senden:

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

Dieses Token kann aus verschiedenen Gründen immer noch ungültig werden und wie dies gehandhabt wird, wird in How-To: Behandeln abgelaufener Zugriffstoken Blogbeitrag beschrieben.

Update:
Ab 7.08.2012 können Sie die Methode setExtendedAccessToken verwenden, um access_token Zu erweitern, anstatt die URL manuell zu erstellen und Details abzurufen.

22
Juicy Scripter

// mit einem Javascript für Popup für Facebook anmelden

FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;

// habe den Zugang mit 1-2 Stunden Ablaufzeit bekommen

// habe das accessstoken in einen controller namens facebook controller bekommen

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

// Zugriffstoken auf 60 Tage erweitern

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

// Nach der Ausführung des folgenden Codes erhalten wir eine Antwort mit einer Ablaufzeit von 60 Tagen für das Zugriffstoken.

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

// Die obige Antwort wird zum Parsen gegeben.

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

// Nach dem Parsen des Inhalts im obigen Ausführungscode wird das neue erweiterte Zugriffsrecht gespeichert.

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

// In Sitzung gespeichert.

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

// Hab eine nette Codierung

10
gokul bs

Ein Zugriffstoken, das durch einen serverseitigen OAuth) -Aufruf generiert wird, ist länger und muss nicht ausgetauscht werden. Es ist bereits ein erweitertes Token. Das Einzige, was Sie tun Dazu muss in den App-Einstellungen "Offline-Zugriff verweigern" aktiviert sein. Dies ist natürlich nur erforderlich, wenn zuvor "Offline-Zugriff verweigern" deaktiviert war.

Wenn Sie dann Benutzer über Facebook authentifizieren, erhalten Sie einen Zugriffstoken, der 60 Tage lang gültig ist. Die mehrmalige Authentifizierung am selben Tag führt nur zur ersten Authentifizierung, die die Ablaufzeit verlängert.

3
Robert Kajic

Sollten Sie ein Zugriffstoken benötigen, das [~ # ~] niemals [~ # ~] für eine [~ # ~] Seite [~ # ~] abläuft Siehe meine Antwort auf eine ähnliche Frage hier

Von der Entwicklerseite:

Wenn Sie ein langlebiges Benutzerzugriffstoken verwenden und den Endpunkt [Benutzer-ID]/accounts abfragen, erhalten Sie jetzt Page Zugriffstoken that verfallen nicht für Seiten that ein Benutzer verwaltet.

2
Pete

Inspiriert von früheren Antworten schrieb ich ein einfaches Programm zur Selbsterneuerung. Legen Sie einfach Ihr aktuelles Token in die Datei 'token.sec'.

Dieses Programm liest ein Token aus der Datei und aktualisiert es mit einem neuen Token, wenn alles in Ordnung ist. In anderen Programmen müssen Sie nur das Token verwenden:

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

Hier sind wir:

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

Zum Schluss können wir dies in unsere Crontab einfügen, um das Token einmal pro Monat zu erneuern:

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

dies dient dazu, das Zugriffs-Token für Seiten so zu verlängern, dass es niemals abläuft, und die Lebensdauer von Benutzer-Zugriffs-Token zu verlängern, die nach zwei Monaten ablaufen (das „neue Zugriffs-Token“).

Okay, es hat ungefähr eine Woche gedauert, aber hier ist meine Lösung. Stellen Sie im https://developers.facebook.com/tools/Explorer/ sicher, dass Sie manage_page als Teil Ihres access_token haben. Verwenden Sie danach diesen Code mit Ihrer App-ID, Ihrem Geheimnis und Ihrer Weiterleitung:

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

        }
    }*/

?>

Kopieren Sie danach das 'neue Zugriffstoken' und gehen Sie zurück zu https://developers.facebook.com/tools/Explorer/ Wenn Sie dort mit Ihrem neuen Zugriffstoken vorbeigekommen sind, geben Sie es in das Feld Zugriffstoken ein . Klicken Sie anschließend auf "Senden". Danach sehen Sie im Knoten ein + _ ___ Klicken Sie darauf und scrollen Sie zu den Konten und klicken Sie auf Das. Suchen Sie die Seite, für die Sie das Zugriffstoken benötigen, und kopieren Sie sie und fügen Sie sie in das Feld für den Zugriffsschlüssel ein. Klicken Sie auf Debuggen und Sie werden sehen, dass es niemals abläuft. Speichern Sie dieses Token, es bleibt gültig, solange Sie Ihre Apps nicht geheim zurücksetzen.

0
Aaron Dartt