Есть ли способ проверить, действителен ли токен доступа Facebook?

Мой сайт использует токены доступа к жизни (offline_access). Однако, если пользователь изменяет свой пароль, токен доступа сбрасывается. Есть ли способ проверить, является ли текущий токен доступа действительным, прежде чем делать вызовы Graph API? Спасибо за ваше время.

10 ответов

Решение

По сути, FB хочет, чтобы вы опрашивали его или выявляли случай и перенаправляли пользователя, чтобы получить повторное выполнение. Раздражает, но официально

(Старая, устаревшая ссылка. См. Ниже) https://developers.facebook.com/blog/post/500/

Изменить: Facebook изменил свою структуру ссылок без перенаправлений. Не удивлен.

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

В автономном режиме, без отправки чего-либо на Facebook - я так не думаю. Самый простой способ - отправить запрос по адресу:

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

Facebook также поддерживает подписки на обновления в режиме реального времени, но я не уверен, как применить их в этой ситуации.

Если вы хотите узнать время истечения токена, вы можете передать открытый URL-адрес графика, используя appid и токен, как показано ниже.

https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token=xxxxxxxxx

Вы можете проверить токен с помощью сервиса отладки токена, посмотрите здесь

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

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

Я прошел эти посты, но я нашел очень хорошие решения, как это:

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

Ответ на этот запрос предоставит вам все необходимое:

  • идентификатор вашего приложения - это подтверждает, что токен из вашего приложения
  • имя приложения - которое также можно проверить
  • expires_at - время истечения токена
  • is_valid - логическое значение для проверки
  • user_id - который вы также можете сравнить и проверить

Просто отметьте, что "|" знак должен быть там как буква

Обновления в реальном времени позволят вам решить эту проблему, но это будет довольно сложно. По сути, вы можете подписаться на обновления, которые сообщат вам: 1) удалил ли пользователь приложение или 2) удалил ли пользователь разрешения. Вы можете использовать это для хранения текущих разрешений пользователя faceboook. Таким образом, если пользователь удалил ваше приложение, вы будете знать, что срок действия токена истек.

Обновления в режиме реального времени на самом деле рекомендуют Facebook для обработки разрешений. Многие приложения совершают вызовы API каждый раз, когда загружается страница для проверки прав доступа. Это имеет тенденцию быть медленным и ненадежным.

Оффлайн - это невозможно

Спросите, что пользователь дал разрешение или нет:

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

Если токен доступа недействителен, он выдаст ошибку:

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

В противном случае он выдаст список разрешений, которые дал пользователь:

data:[  
   {  
      installed:1,
      ...... permission list......... 
      bookmarked: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;
      }

Обновление это, поскольку вещи изменились с OP:

Вы можете отлаживать токены доступа здесь: https://developers.facebook.com/tools/debug/accesstoken?version=v2.5&q={access_token}

Ответ Отто на пост в Facebook, похоже, является официальным ответом на этот вопрос, однако он использует прямой PHP вместо SDK, а также использует JS для решения проблемы вместо PHP. Если вы используете PHP для проверки допустимого сеанса, вам часто требуется PHP-метод обеспечения действительного сеанса для продолжения.

Следующий код проверяет объект me с помощью API Graph. Если выдается исключение, оно уничтожает * текущий сеанс Facebook.

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

Это заставляет последующие вызовы графа создавать новый сеанс Facebook. Это по крайней мере дает вам доступ к общедоступным данным, так что вы можете отображать страницы, не требуя разрешения пользователя FB:

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

Чтобы получить права доступа пользователя, ему необходимо войти в свое приложение (это отличается от входа в сам Facebook). Вы можете сделать это с помощью JS или PHP:

$facebook->getLoginUrl();

* Обратите внимание, что вызов destroySession() еще не включен в помеченную версию PHP SDK. Используйте главную ветку или исправьте ее.

Другие вопросы по тегам