Gibt es eine Möglichkeit zu überprüfen, ob das Facebook-Zugriffstoken noch gültig ist?

72

Meine Website verwendet lebenslange Zugriffstoken ( offline_access). Wenn der Benutzer jedoch sein Kennwort ändert, wird das Zugriffstoken zurückgesetzt. Gibt es eine Methode, um zu überprüfen, ob das aktuelle Zugriffstoken gültig ist, bevor die Graph-API aufgerufen wird? Vielen Dank für Ihre Zeit.

Axsuul
quelle
Keine der hier veröffentlichten Antworten hat bei mir funktioniert. Diese Antwort hat jedoch: stackoverflow.com/a/41465468/763010
tyler.frankenstein

Antworten:

38

Grundsätzlich möchte FB, dass Sie danach abfragen oder den Fall erkennen und den Benutzer umleiten, damit eine Reauth auftritt. Ärgerlich, aber offiziell:

(Alter, veralteter Link. Siehe unten) https://developers.facebook.com/blog/post/500/

Bearbeiten: Facebook hat seine Linkstruktur ohne Weiterleitungen geändert. Nicht überrascht.

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

Otto
quelle
1
Der Link, dem Sie gefolgt sind, ist möglicherweise fehlerhaft oder die Seite wurde möglicherweise entfernt.
Ashraf Mohammed
11
+1 für den Kommentar "Nicht überrascht". :) "Bewegen Sie sich schnell und brechen Sie Dinge" mag eine großartige Philosophie für Facebook-Unternehmen sein, aber es macht unser Leben sicher schwierig ...
Rinogo
1
@rinogo du hast meinen Kommentar gestohlen! Ich mag auch diese Antwort für den Teil "Nicht überrascht". Ich hasse FB. Es ist ein echter Schmerz. : |
Sufian
72

Offline, ohne etwas an Facebook zu senden - das glaube ich nicht. Der einfachste Weg ist wahrscheinlich, eine Anfrage an folgende Adresse zu senden:

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

Facebook unterstützt auch Abonnements für Echtzeit- Updates, aber ich bin nicht sicher, wie ich sie auf diese Situation anwenden soll.

serg
quelle
45

Wenn Sie die Ablaufzeit des Tokens wissen möchten, können Sie eine offene Diagramm-URL mit appid und token übergeben, wie unten beschrieben.

https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token=xxxxxxxxx
Chaitanya Bharat
quelle
1
Der client_idParameter hier macht nichts. Sie können es weglassen.
Jeroen
7

Sie können das Token mithilfe des Token-Debug-Dienstes überprüfen. Schauen Sie hier

https://graph.facebook.com/debug_token?input_token=INPUT_TOKEN&access_token=ACCESS_TOKEN

https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/

Avi Kapuya
quelle
Obwohl Chaitanya Bharats Antwort einfacher ist und in den meisten Fällen gut funktioniert, scheint dieser Ansatz für mich der beste zu sein.
x1a0
3
Was ist ein Eingabe-Token?
Pablo SG Pacheco
4

Die Echtzeit-Updates würden es Ihnen ermöglichen, dieses Problem zu lösen, aber es wäre ziemlich kompliziert. Grundsätzlich können Sie Updates abonnieren, die Ihnen mitteilen, 1) ob der Benutzer die App entfernt hat oder 2) ob der Benutzer Berechtigungen entfernt hat. Sie können dies verwenden, um die aktuellen Berechtigungen des Faceboook-Benutzers zu speichern. Wenn der Benutzer Ihre App entfernt hat, wissen Sie auf diese Weise, dass das Zugriffstoken abgelaufen ist.

Echtzeit-Updates werden von Facebook empfohlen, um mit Berechtigungen umzugehen. Viele Apps rufen jedes Mal eine API auf, wenn eine Seite geladen wird, um nach Berechtigungen zu suchen. Dies ist in der Regel langsam und unzuverlässig.

Nathan Totten
quelle
3
Was ist, wenn der Benutzer sein Passwort ändert?
Ashfame
3

Ich habe diese Beiträge durchgesehen, aber ich habe sehr gute Lösungen wie diese gefunden:

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

Die Antwort auf diese Anfrage bietet Ihnen alles, was Sie brauchen:

  • Ihre App-ID - Hiermit wird überprüft, ob das Token aus Ihrer Anwendung stammt
  • Anwendungsname - kann auch überprüft werden
  • expires_at - Ablaufzeit des Tokens
  • is_valid - Boolescher Wert zur Überprüfung
  • user_id - die Sie auch vergleichen und überprüfen können

Beachten Sie einfach, dass "|" Zeichen muss dort als Brief sein

Pavol Golias
quelle
1
        //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;
      }
Ashraf Mohammed
quelle
1

Offline - das ist nicht möglich

Fragen Sie, ob der Benutzer die Erlaubnis gegeben hat oder nicht:

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

Wenn das Zugriffstoken ungültig ist, wird ein Fehler ausgegeben:

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

Andernfalls wird eine Liste der Berechtigungen angezeigt, die der Benutzer erteilt hat:

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

Ottos Antwort auf den Facebook-Beitrag scheint die offizielle Antwort auf diese Frage zu sein, verwendet jedoch direktes PHP anstelle des SDK und JS, um das Problem anstelle von PHP zu lösen. Wenn Sie PHP verwenden, um nach einer gültigen Sitzung zu suchen, benötigen Sie häufig eine PHP-Methode, um eine gültige Sitzung sicherzustellen, um fortzufahren.

Der folgende Code überprüft das me-Objekt mit der Diagramm-API. Wenn eine Ausnahme ausgelöst wird, wird * die aktuelle Facebook-Sitzung zerstört.

try{
    $facebook->api('/me');
}
catch( FacebookApiException $e ){
    $facebook->destroySession();
}

Dies erzwingt spätere Diagrammaufrufe, um eine neue Facebook-Sitzung zu instanziieren. Dadurch erhalten Sie zumindest Zugriff auf öffentliche Daten, sodass Sie Seiten rendern können, für die keine FB-Benutzerberechtigungen erforderlich sind:

$facebook->api('/userName');

Um wieder Zugriff auf die Benutzerberechtigung zu erhalten, muss sich der Benutzer bei Ihrer App anmelden (dies unterscheidet sich von der Anmeldung bei Facebook selbst). Sie können dies mit JS oder mit PHP tun:

$facebook->getLoginUrl();

* Beachten Sie, dass der Aufruf von destroySession () noch nicht in einer getaggten Version des PHP SDK enthalten ist. Verwenden Sie den Hauptzweig oder patchen Sie ihn ein.

Jonah Braun
quelle