Мой сайт использует токены доступа (offline_access
). Однако, если пользователь изменяет свой пароль, токен доступа получает reset. Есть ли способ проверить, действительно ли текущий токен доступа действителен перед вызовом Graph API? Спасибо за ваше время.
Есть ли способ проверить, действует ли токен доступа к Facebook?
Ответ 1
В принципе, FB хочет, чтобы вы опросили его, или чтобы обнаружить случай и перенаправить пользователя, чтобы получить reauth. Раздражающий, но официальный:
(старая, устаревшая ссылка. См. ниже) https://developers.facebook.com/blog/post/500/
Изменить: Facebook изменил структуру ссылок без перенаправления. Не удивлен.
https://developers.facebook.com/blog/post/2011/05/13/how-to--handle-expired-access-tokens/
Ответ 2
В автономном режиме, не отправляя ничего в facebook - я так не думаю. Самый простой способ - это, вероятно, отправить запрос:
https://graph.facebook.com/me?access_token=...
Facebook также поддерживает подписки на в режиме реального времени, но я не уверен, как применить их к этой ситуации.
Ответ 3
Если вы хотите узнать время истечения срока действия токена, вы можете передать открытый граф url с помощью appid и токена, как показано ниже.
https://graph.facebook.com/oauth/access_token_info?client_id=APPID&access_token=xxxxxxxxx
Ответ 4
Вы можете проверить токен, используя службу отладки токенов, посмотрите здесь
https://graph.facebook.com/debug_token?input_token=INPUT_TOKEN&access_token=ACCESS_TOKEN
https://developers.facebook.com/docs/howtos/login/debugging-access-tokens/
Ответ 5
Обновления в реальном времени позволят вам решить эту проблему, но это будет довольно сложно. В принципе, вы можете подписаться на обновления, которые расскажут вам: 1) если пользователь удалил приложение или 2), если пользователь удалил разрешения. Вы можете использовать это, чтобы сохранить текущие разрешения пользователя faceboook. Таким образом, если пользователь удалит ваше приложение, вы узнаете, что токен доступа истек.
Обновления в реальном времени на самом деле являются справочными материалами, рекомендованными в facebook, для обработки разрешений. Многие приложения совершают вызовы api каждый раз, когда страница загружается для проверки разрешений. Это имеет тенденцию быть медленным и ненадежным.
Ответ 6
//When user access token expires user must be logged in and renew the access token him self.it is a Facebook policy
//you can overcome this by sending email to users who have expired access token.
//create a table of successful sending to monitor sending process
//if any failure happened with the user an email is sent to him to ask him to activate there account again.with a link to your subscription page.
//and here is the code should be written on that page.
$app_id = "YOUR_APP_ID";
$app_secret = "YOUR_APP_SECRET";
$my_url = "YOUR_POST_LOGIN_URL";
// known valid access token stored in a database
$access_token = "YOUR_STORED_ACCESS_TOKEN";
$code = $_REQUEST["code"];
// If we get a code, it means that we have re-authed the user
//and can get a valid access_token.
if (isset($code)) {
$token_url="https://graph.facebook.com/oauth/access_token?client_id="
. $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret
. "&code=" . $code . "&display=popup";
$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$access_token = $params['access_token'];
}
// Attempt to query the graph:
$graph_url = "https://graph.facebook.com/me?"
. "access_token=" . $access_token;
$response = curl_get_file_contents($graph_url);
$decoded_response = json_decode($response);
//Check for errors
if ($decoded_response->error) {
// check to see if this is an oAuth error:
if ($decoded_response->error->type== "OAuthException") {
// Retrieving a valid access token.
$dialog_url= "https://www.facebook.com/dialog/oauth?"
. "client_id=" . $app_id
. "&redirect_uri=" . urlencode($my_url);
echo("<script> top.location.href='" . $dialog_url
. "'</script>");
}
else {
echo "other error has happened";
}
}
else {
// success
echo("success" . $decoded_response->name);
echo($access_token);
}
// note this wrapper function exists in order to circumvent PHP
//strict obeying of HTTP error codes. In this case, Facebook
//returns error code 400 which PHP obeys and wipes out
//the response.
function curl_get_file_contents($URL) {
$c = curl_init();
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_URL, $URL);
$contents = curl_exec($c);
$err = curl_getinfo($c,CURLINFO_HTTP_CODE);
curl_close($c);
if ($contents) return $contents;
else return FALSE;
}
Ответ 7
Не в сети - невозможно
Попросите пользователя дать разрешение или нет:
https://graph.facebook.com/{facebook-id}/permissions?access_token={access-teken}
если токен доступа неверен, он выдаст ошибку:
{
error: {
message: "The access token could not be decrypted",
type: "OAuthException",
code: 190
}
}
В противном случае он предоставит список разрешений, которые пользователь дал:
data: [
{
installed: 1,
...... permission list.........
bookmarked: 1
}
],
Ответ 8
Обновление этого, поскольку с момента работы изменились вещи:
Вы можете отлаживать токены доступа здесь: https://developers.facebook.com/tools/debug/accesstoken?version=v2.5&q= {access_token}
Ответ 9
Отто ответ на сообщение в facebook кажется официальным ответом на этот вопрос, однако он использует прямой PHP вместо SDK, а также использует JS для решения проблемы вместо PHP. Если вы используете PHP для проверки действительного сеанса, вам часто необходим PHP-метод для обеспечения действительного сеанса, чтобы продолжить.
Следующий код проверяет объект my с API-интерфейсом графа. Если выбрано исключение, оно уничтожает * текущую сессию Facebook.
try{
$facebook->api('/me');
}
catch( FacebookApiException $e ){
$facebook->destroySession();
}
Это приводит к более поздним вызовам графа для создания нового сеанса Facebook. Это, по крайней мере, дает вам доступ к общедоступным данным, чтобы вы могли визуализировать страницы, не требуя прав пользователя FB:
$facebook->api('/userName');
Чтобы получить доступ к пользовательскому разрешению, пользователю необходимо будет войти в ваше приложение (это отличает его от входа в сам Facebook). Вы можете сделать это с помощью JS или с PHP:
$facebook->getLoginUrl();
* Обратите внимание, что вызов destroySession() еще не находится в тегером SDK. Используйте основную ветвь или вставьте ее.