0

この記事は質問 (ユーザー アクセス トークンを取得するにはどうすればよいですか? ) に対する回答ではないので、ユーザー アクセス トークンの取得方法についてお聞きしたいと思います。

アプリのアクセス トークンは既にあります。簡単です。最新のphp sdk Base_facebookクラスにもgetUserAccesstoken関数があるのを見ましたが、最終的にはアプリアクセストークンしか取得できないため役に立ちません。

これが私の認証フローです。ユーザーはファンページ アプリに入り、ある時点で権限を承認する必要があります。

$facebook = new Facebook(array(
    'appId' => $app_id,
    'secret' => $secret,
    'cookie' => true
));

$user = $facebook->getUser(); 

if($user == 0) {

  $login_url = $facebook->getLoginUrl($params = array('scope' => "publish_stream", 'redirect_uri' => "https://www.facebook.com/pages/PAGENAME/PAGE-ID?sk=app_APP-ID0&app_data=af"));

echo ("<script> top.location.href='".$login_url."'</script>");
}

これは問題なく機能します。app_data "af" パラメータは、ファンページ アプリ内のページを取得するように設定されています。

アプリを削除して認証ページに戻ると、ユーザー Cookie ($user) がまだ設定されているため、ユーザーに再度アクセス許可を求めることはありません。

そのため、権限も確認したかったので、ユーザーアクセストークンが必要です

    try{
        $permissions = $facebook->api("/me/permissions", 'GET', array('access_token' => "$access_token" ));
    }
    catch (Exception $e) {echo ("<script> top.location.href='".$login_url."'</script>"); }

    if( array_key_exists('publish_stream', $permissions['data'][0]) ) {
        // Permission is granted!

    } else {
        echo ("<script> top.location.href='".$login_url."'</script>");
    }

そこで、サーバー側の認証の例 ( https://developers.facebook.com/docs/authentication/server-side/ ) を試してみましたが、内部から $_REQUEST を読み取ることができないため、もちろんここでは機能しません。アプリなので、ここで立ち往生します。- アプリ内の権限はどのように確認していますか?

   $app_id = "YOUR_APP_ID";
   $app_secret = "YOUR_APP_SECRET";
   $my_url = "YOUR_URL";

   session_start();
   $code = $_REQUEST["code"];

   if(empty($code)) {
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
     $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state'];

     echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }

   if($_REQUEST['state'] == $_SESSION['state']) {
     $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
       . "&client_secret=" . $app_secret . "&code=" . $code;

     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);

     $graph_url = "https://graph.facebook.com/me?access_token=" 
       . $params['access_token'];

     $user = json_decode(file_get_contents($graph_url));
     echo("Hello " . $user->name);
   }
   else {
     echo("The state does not match. You may be a victim of CSRF.");
   }

TIA & 乾杯、ダニエル

4

1 に答える 1

0

サーバー側認証に関する Facebook Developer Docs のセクションを参照してください: https://developers.facebook.com/docs/authentication/server-side/

または、ハイブリッド クライアント サーバー認証を使用することもできます: http://developers.facebook.com/blog/post/534/

于 2012-05-08T23:19:00.397 に答える