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


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

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

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

7 59

7 ответов:

Edit (14 августа 2012):
Неделю назад был обновлен официальный Facebook 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'];
}

собственно то, что было сказано:

Если access_token генерируется из вызова OAuth на стороне сервера, результирующий access_token будет иметь более длительный срок годности. Если вызов выполняется при наличии действительного access_token для этого пользователя, то возвращенный 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: обрабатывать маркеры доступа с истекшим сроком действия сообщение в блоге.

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

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

FB.login(function(response) {

            if (response.authResponse) {

                   var accessToken = response.authResponse.accessToken;

/ / получил accesstoken с 1-2 часами истекает время

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

        $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'];

//после выполнения ниже кода, мы будем иметь ответ с токеном acess истекает время до 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);

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

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

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

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

/ / есть хорошая кодировка

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

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

Если вам нужен маркер доступа, что никогда заканчивается страница, смотрите мой ответ на аналогичный вопрос здесь

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

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

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

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

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

$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