Как продлить срок действия токена с момента отмены офлайн_access
Поскольку offline_access
Permission устарел в Facebook Authentication, мы имеем проблема получения так называемых долгоживущих токенов доступа без этого разрешения.
В документе в Facebook об устаревании он говорит, что на стороне сервера OAuth сгенерированные токены доступа будут долговечными, но это не так.
Я что-то упустил? Некоторые настройки в настройках приложения? Какой-то специальный код, который мне нужно использовать для продления срока действия токенов доступа? Поскольку я понимаю документацию, для аутентификации на стороне сервера маркер доступа, к которому может быть доступен метод getAccessToken()
PHP SDK, когда пользователь вошел в систему, долговечен.
Ответы
Ответ 1
Изменить (14 августа 2012 г.):
Неделю назад был обновлен официальный PHP PHP SDK. Имя функции было изменено на setExtendedAccessToken, и было решено, что нам действительно необходимо уничтожить сеанс впоследствии, чтобы удалить риск наличия двух активных сеансов.
Кроме того, функция больше не возвращает токен, а сохраняет его в постоянных данных. Таким образом, вы можете получить новый токен доступа с публичной функцией getAccessToken. Возьмите новый SDK с официальной страницы PHP 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'];
}
Ответ 2
Собственно, что было сказано:
Если 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: Handle expel tokens в блоге.
Update:
Начиная с 07 августа 2012 г. вы можете использовать метод setExtendedAccessToken
для расширения access_token
вместо ручного создания URL-адреса и получения деталей.
Ответ 3
//использование 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'];
//использование токена доступа для расширения до 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');
//Иметь хорошее кодирование
Ответ 4
Маркер доступа, сгенерированный с помощью вызова OAuth на стороне сервера, будет иметь расширенный (более длинный) вид, и вам не нужно его обменивать. Это уже расширенный токен.
Единственное, что вы должны сделать, это включить "Неактуальный автономный доступ" в настройках вашего приложения. Это, конечно, необходимо только в том случае, если ранее был отключен "Недостаточный автономный доступ".
Затем, когда вы аутентифицируете пользователей через Facebook, вы получите токен доступа, который проживает 60 дней. Аутентификация нескольких раз в течение того же дня приведет только к первой аутентификации, продлевающей срок действия.
Ответ 5
Если вам нужен токен доступа, срок действия НИКОГДА для PAGE, см. мой ответ на аналогичный вопрос здесь
На странице разработчиков:
Используя долгоживущий токен доступа пользователя, запрос [Пользователь ID]/accounts теперь будет предоставлять страницу токены доступа, чтобы не выполнять expire для страниц, которыми управляет пользователь.
Ответ 6
это означает, что токены доступа к страницам еще не заканчиваются и продлевает срок службы токенов доступа пользователя, истекающих через 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/. Когда вы доберетесь до своего нового токена доступа в поле токена доступа.
Затем нажмите "Отправить". После этого в node вы увидите клик + ____ и прокрутите вниз до учетных записей и нажмите на него. найдите страницу, на которой нужен токен доступа, и скопируйте ее и вставьте в поле ключа доступа. нажмите кнопку "Отладка", и вы увидите, что она никогда не истечет. сохраните этот токен, он останется действительным, если вы не reset секрет ваших приложений.
Ответ 7
Вдохновленный предыдущими ответами, я написал простую программу самообновления токенов. Во-первых, просто поместите текущий токен в файл 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