it-swarm.com.ru

Как продлить срок действия токена доступа после устаревания offline_access

Поскольку offline_accessPermission устарела в потоке Facebook Authentication , у нас возникла проблема с получением так называемых долгоживущих токенов доступа без этого разрешения.

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

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

59
Rok Dominko

Изменить (14 августа 2012 г.):
Неделю назад был обновлен официальный SDK для Facebook PHP. Имя функции было изменено на 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'];
}
72
Marc Hoogvliet

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

Если 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

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

Update:
По состоянию на 7 августа 2012 г. вы можете использовать метод setExtendedAccessToken для расширения access_token вместо того, чтобы вручную создавать URL-адрес и получать детали.

22
Juicy Scripter

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

FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;

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

// получил accesstoken в контроллер, называемый контроллером 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');

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

10
gokul bs

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

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

3
Robert Kajic

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

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

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

2
Pete

Вдохновленный предыдущими ответами, я написал простую программу самообновления токенов. Во-первых, просто поместите ваш текущий токен в файл 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
Sung Kim

это предназначено для продления срока действия токенов доступа к страницам до истечения срока их действия и продления срока действия пользовательских токенов доступа, срок действия которых истекает через 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/ Когда вы пройдете через свой новый токен доступа в поле токена доступа , Затем нажмите "Отправить". После этого в узле вы увидите + _ ___ , щелкните по нему и прокрутите вниз до учетные записи и нажмите на это. найдите страницу, для которой нужен токен доступа, скопируйте и вставьте ее в поле ключа доступа. нажмите кнопку отладки, и вы увидите, что он никогда не истечет. сохраните этот токен, он останется действительным до тех пор, пока вы не сбросите секрет своих приложений.

0
Aaron Dartt