Как продлить срок действия маркера доступа с момента устаревания автономного доступа
С offline_access
разрешение устарел в Facebook проверка подлинности flow, у нас есть проблема получения так называемых долгоживущих токенов доступа без этого разрешения.
на документ Facebook об осуждении Он говорит, что на стороне сервера OAuth генерируемые маркеры доступа будут долго жить, но они не являются.
Я что-то пропустила? Некоторые настройки в настройках приложения? Какой-то специальный код, который мне нужно использовать для расширения срок действия токенов доступа? Насколько я понимаю документацию, для аутентификации на стороне сервера маркер доступа, к которому можно получить доступ getAccessToken()
метод PHP SDK, когда пользователь вошел в систему, является долгоживущим.
7 ответов
Edit (14 августа 2012):
Неделю назад официальный Facebook PHP SDK был обновлен. Имя функции было изменено на setExtendedAccessToken, и было решено, что нам действительно нужно уничтожить сеанс после этого, чтобы устранить риск проведения двух активных сеансов.
Кроме того, функция больше не возвращает токен, а вместо этого сохраняет его в постоянных данных. Поэтому вы можете получить новый токен доступа с помощью функции public процедуры 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
этот маркер еще может стать недействительным по нескольким причинам, и как с этим справиться описано в инструкции: ручки, маркеры доступа истек блоге.
обновление:
По состоянию на 07 августа 2012 вы может использовать setExtendedAccessToken
способ продлить access_token
вместо ручного построения URL и получения сведений.
/ / использование javascript для всплывающего окна для входа в facebook
FB.login(function(response) {
if (response.authResponse) {
var accessToken = response.authResponse.accessToken;
/ / получил accesstoken с 1-2 часами истекает время
/ / получил accesstoken в контроллер под названием Facebook controller
$request = $this->getRequest();
$params = $request->getParams();
$token=$params['accessToken'];
/ / принимая маркер доступа для расширения до 60days
$conf = $this->getConfigs();
$appid = $conf['fbdetails']['appid'];
$secret = $conf['fbdetails']['secret'];
$baseurl = $conf['app']['baseurl'];
/ / после выполнения кода ниже, у нас будет ответ с токеном acess истекает время до 60days.
$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, будет иметь расширенный (более длинный) вид, и вам не нужно его обменивать. Это уже расширенный токен. Единственное, что вам нужно сделать, это включить "устаревший автономный доступ" в настройках Вашего приложения. Это, конечно, необходимо только в том случае, если" устаревший автономный доступ " был ранее отключен.
затем, когда вы аутентифицировать пользователей через Facebook вы получаете маркер доступа, который живет в течение 60 дней. Аутентификация нескольких время в течение того же дня приведет только к первой аутентификации, продлевающей срок действия.
Если вам нужен маркер доступа, который никогда заканчивается страница см. Мой ответ на подобный вопрос здесь
со страницы разработчиков:
с помощью долгоживущего маркера доступа пользователя, запрашивая [пользователь ID] / accounts endpoint теперь предоставит страницу маркеры доступа это не истекает для страниц что пользователь управляет.
это для расширения маркера доступа к страницам до истечения срока действия никогда и продления срока действия маркеров доступа пользователей, истекающих через 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 +____ нажмите на это и прокрутите вниз до учетных записей и нажмите это. найдите страницу, для которой вам нужен маркер доступа, скопируйте ее и вставьте в поле ключ доступа. нажмите debug, и вы увидите, что он никогда не будет истекать. сохраните этот токен, он останется действительным до тех пор, пока вы не сбросите секрет приложений.
вдохновленный предыдущими ответами, я написал простую программу самообновления токенов. Во-первых, просто поставить маркер в маркер.файл 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