最近、JavaScript SDK を使用した Facebook グラフ API へのリクエストが、次のエラーで返される場合があることを試行錯誤して知りました。
{
"error":{
"message":"An active access token must be used to query information about the current user.",
"type":"OAuthException","code":2500
}
}
最近、JavaScript SDK を使用した Facebook グラフ API へのリクエストが、次のエラーで返される場合があることを試行錯誤して知りました。
{
"error":{
"message":"An active access token must be used to query information about the current user.",
"type":"OAuthException","code":2500
}
}
手っ取り早いがやや汚い解決策は、各リクエストに access_token をパラメーターとして追加し、JavaScript SDK に頼らないことです。
//request to get profile information for the current user
FB.api("me", {
access_token: "<access-token-for-user>"
}, function(response){
//handle response here
});
詳細
通常、ユーザーの access_token をパラメーターとして FB.init を呼び出して、クライアント側アプリケーションを開始します。これは、facebook グラフへの GET リクエストに access_token を添付することで、行われた FB.api リクエストが確実に認証されるようにするためのものです。ただし、場合によっては、アプリケーション セッションからトークンが突然消え、Facebook グラフへの GET 要求にトークンが存在しないために、グラフへのすべての要求が失敗することがあります。
再現可能なシナリオの 1 つは、FB.api リクエストを送信して、削除された Facebook の投稿にコメントすることです。これを行うと、OAuth 例外エラーが返され、現在のセッションからトークンが誤って削除されます。
By adding the token manually to all of your FB.api requests, you can ensure the token is always included.
このコードを確認してください。アクセス トークンは次の URL で送信されます。
<?php
$facebook_appid = "facebook_appid"; // Facebook appplication id
$facebook_secret = "facebook_secret"; // Facebook secret id
$facebook_pageid = "facebook_pageid"; // Facebook secret id
$redirect_uri = "https://localhost/facebook_page/events.php"; // return url to our application after facebook login ## should be SAME as in facebook application
//$redirect_uri = "https://localhost/facebook_page/fb_login.php"; // return url to our application after facebook login ## should be SAME as in facebook application
$scope = "user_photos,email,user_birthday,user_online_presence,offline_access,manage_pages,publish_stream,user_events,friends_events"; // User permission for facebook
$code = $_REQUEST["code"]?$_REQUEST["code"]:"";
if(empty($code)) {
$_SESSION['state'] = time(); // CSRF protection
$dialog_url = "https://www.facebook.com/dialog/oauth?client_id=". $facebook_appid . "&redirect_uri=" . urlencode($redirect_uri) . "&state=". $_SESSION['state'] . "&scope=".$scope;
header("location:".$dialog_url);
}
if($_SESSION['state'] && ($_SESSION['state'] == $_REQUEST['state'])) {
$token_url = "https://graph.facebook.com/oauth/access_token?". "client_id=" . $facebook_appid . "&redirect_uri=" . urlencode($redirect_uri). "&client_secret=" . $facebook_secret . "&code=" . $code;
$response = @file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$account_url = "https://graph.facebook.com/".$facebook_pageid."?fields=access_token&access_token=".$params['access_token'];
$resp = @file_get_contents($account_url);
$dt = json_decode($resp);
echo $dt->access_token;
echo "<br>";
echo $dt->id;
$offer_url = "https://graph.facebook.com/".$dt->id."/feed?access_token=".$dt->access_token;
$off = @file_get_contents($offer_url);
$dto = json_decode($off);
echo "<pre>";
print_r($dto);
}
?>