Как продлить срок действия токена доступа после устаревания offline_access - PullRequest
60 голосов
/ 24 января 2012

Поскольку offline_access Разрешение устарело в потоке Аутентификация Facebook, у нас возникла проблема с получением так называемых долгосрочных токенов доступа без этого разрешения.

В В документе Facebook об устаревании говорится, что генерируемые токены доступа OAuth на стороне сервера будут долгоживущими, но это не так.

Я что-то упустил?Некоторые настройки в настройках приложения?Какой-то специальный код, который мне нужно использовать, чтобы продлить срок действия токенов доступа?Как я понимаю из документации, для аутентификации на стороне сервера токен доступа, к которому можно получить доступ с помощью getAccessToken() метода PHP SDK, когда пользователь вошел в систему, является долгоживущим.

Ответы [ 7 ]

72 голосов
/ 27 января 2012

Изменить (14 августа 2012 г.):
Неделю назад был обновлен официальный PHP PHP SDK. Имя функции было изменено на setExtendedAccessToken , и было решено, что нам действительно нужно впоследствии уничтожить сеанс, чтобы исключить риск наличия двух активных сеансов.
Кроме того, функция больше не возвращает токен, а сохраняет его в постоянных данных. Поэтому вы можете получить новый токен доступа с помощью публичной функции getAccessToken впоследствии. Получите новый SDK со официальной страницы Facebook PHP SDK github , чтобы быть в курсе.

Оригинальный ответ:

Я добавил новую публичную функцию в файл base_facebook.php, которая возвращает новый токен доступа, срок действия которого истекает через 60 дней. Вы можете сделать запрос на эту функцию после того, как получите токен обычного доступа. Я не проверял, но я предполагаю, что вам также нужно включить «deprecate offline_access» в расширенных настройках приложения разработчика.

Просто добавьте это в ваш base_facebook.php внутри класса facebook и позвоните ему. Это работает для меня.

 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'];
}
22 голосов
/ 24 января 2012

На самом деле, что было сказано:

Если access_token сгенерирован из OAuth-вызова на стороне сервера, результирующий access_token будет иметь более длительное время истечения . Если вызов сделан, пока для этого пользователя все еще существует действительный токен доступа, возвращенный токен доступа из этого второго вызова останется прежним, и только время истечения будет продлено. Опять же, повторный вызов в течение одного и того же дня приведет только к тому, что первый вызов продлит срок действия.

Это означает, что он будет длиннее, чем сгенерированный токен на стороне клиента, и для получения расширенного токена (60 дней) вам нужно сделать это вручную, отправив запрос на:

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

Этот токен все еще может стать недействительным по нескольким причинам, и как это сделать, описано в Инструкции: обработка маркеров доступа с истекшим сроком сообщение в блоге.

Обновление:
Начиная с 07 августа 2012 г. вы можете использовать метод setExtendedAccessToken для расширения access_token вместо того, чтобы вручную создавать URL и извлекать подробности.

10 голосов
/ 05 марта 2012

// использование javascript для всплывающего окна для входа в Facebook

FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;

// получил токен доступа с истечением 1-2 часа

// получил токен доступа в контроллере под названием facebookконтроллер

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

// получение маркера доступа для расширения до 60 дней

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

// После выполнения приведенного ниже кода у нас будет ответ со временем истечения срока действия токена доступа до 60 дней.

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

// Выше приведен ответ для разбора.

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

// после анализа содержимого в приведенном выше коде выполнения сохраняется новый расширенный токен доступа.

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

// сохраняется в сеансе.

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

// Приятного кодирования

3 голосов
/ 04 апреля 2012

Маркер доступа, сгенерированный с помощью OAuth-вызова на стороне сервера, будет расширенным (более длинным), и вам не нужно его обменивать.Это уже расширенный токен.Единственное, что вам нужно сделать, это включить «Отказаться от автономного доступа» в настройках вашего приложения.Это, конечно, необходимо только в том случае, если ранее «Отключить автономный доступ» было отключено.

Затем, когда вы будете аутентифицировать пользователей через Facebook, вы получите токен доступа, который живет 60 дней.Аутентификация несколько раз в течение одного дня приведет к тому, что только первая аутентификация продлит срок действия.

2 голосов
/ 18 декабря 2012

Если вам нужен токен доступа, который НИКОГДА не истекает для СТРАНИЦЫ , см. Мой ответ на аналогичный вопрос здесь

Со страницы разработчиков:

Используя долгоживущий токен доступа пользователя, запрашивая [User ID] / конечная точка аккаунта теперь будет предоставлять страницу токенов доступа , которые не имеют срок действия страниц , которыми управляет пользователь.

0 голосов
/ 08 февраля 2016

Вдохновленный предыдущими ответами, я написал простую программу самообновления токенов. Во-первых, просто поместите ваш текущий токен в файл 'token.sec'.

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

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

Вот и мы:

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

Наконец, мы можем добавить это в наш crontab, чтобы обновлять токен один раз в месяц:

0 0 1 * * cd /home/<path>; php exchangeToken.php
0 голосов
/ 01 апреля 2013

это для продления срока действия токенов доступа к страницам до истечения срока их действия и продления срока действия пользовательских токенов доступа, срок действия которых истекает через 2 месяца («новый токен доступа»).

Хорошо, это заняло около недели исследований, но вот мое решение. в https://developers.facebook.com/tools/explorer/ убедитесь, что у вас есть manage_page как часть вашего access_token. после этого используйте этот код с идентификатором вашего приложения, секретом и перенаправлением:

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

        }
    }*/

?>

После этого скопируйте «новый токен доступа» и вернитесь к https://developers.facebook.com/tools/explorer/ Когда вы пройдете через свой новый токен доступа в поле токена доступа. Затем нажмите «Отправить». После этого в узле вы увидите + _ ___ , щелкните по нему, прокрутите вниз до учетных записей и щелкните по нему. найдите страницу, для которой нужен токен доступа, скопируйте и вставьте ее в поле ключа доступа. нажмите кнопку отладки, и вы увидите, что он никогда не истечет. сохраните этот токен, он останется в силе до тех пор, пока вы не сбросите секрет своих приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...