-1

我正在尝试使用 Facebook 身份验证登录我的网站,它工作正常。但是,当我使用 https://apps.facebook.com/myApp访问应用程序时,我会收到错误消息

状态不匹配。你可能是 CSRF 的受害者

这是我从 facebook 使用的代码,我认为有问题

$我的网址

 <?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 拿出来。然后,您无需重新创建任何图形调用,因为它们都已为您处理。

但是有两个问题:

  1. 您需要在登录调用中对整个返回 URL 进行编码,即

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

  2. 如果要将数据传递到 iFrame,则需要将其发送到名为“app_data”的参数中 - 所有其他参数都将被删除。此 app_data 在“签名请求”中发送,因此您需要解码签名请求。详细信息http://developers.facebook.com/docs/authentication/signed_request/(再次使用 facebook SDK,因为它可以轻松处理签名请求!)。

于 2012-06-02T06:25:26.063 回答