-1

Facebook認証を使用して自分のWebサイトにログインしようとしていますが、正常に機能します。ただし、 https://apps.facebook.com/myAppを使用してアプリケーションにアクセスする と、エラーが発生します

状態が一致しません。あなたはCSRFの犠牲者かもしれません

これが私がFacebookから使用しているコードです、私はに問題があると思います

$ my_url

 <?php 

   $app_id = "YOUR_APP_ID";
   $app_secret = "YOUR_APP_SECRET";
   $my_url = "https://www.example.com/login.php";

   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.");
   }

 ?>
4

1 に答える 1

0

Facebook が FTP 用に提供している SDK を実際に公開する必要があります。その後、すべてが処理されるため、グラフ呼び出しを再作成する必要はありません。

しかし、次の 2 つの問題があります。

  1. ログイン呼び出しでリターン URL 全体をエンコードする必要があります。

    &redirect_uri=" . urlencode($my_url . "&state=" . $_SESSION['状態']);

  2. データを iFrame に渡したい場合は、「app_data」というパラメーターで送信する必要があります。他のすべてのパラメーターは削除されます。この app_data は「署名付きリクエスト」で送信されるため、signed_request をデコードする必要があります。詳細http://developers.facebook.com/docs/authentication/signed_request/ (ここでも、署名付きリクエストを簡単に処理できる Facebook SDK を使用してください)。

于 2012-06-02T06:25:26.063 に答える