0

该代码是根据fb手册,我注意到如果用户刷新页面,我无法检索用户的ID..用户需要从地址栏中清除我的网址后的整个字符串,在为了能够获取用户信息..

<?php 

   $app_id = "myid";
   $app_secret = "mysecretkey";
   $my_url = "http://myurl.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'] . "&scope=publish_actions";

     header("Location: " . $dialog_url);
   }
   if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['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);

     $_SESSION['access_token'] = $params['access_token'];

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

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

var_dump 在第一次重定向后返回给我所有必要的信息,但是如果我刷新页面它返回 null .. 也许我需要“销毁”任何会话 cookie?

4

2 回答 2

1

发生这种情况是$code因为您正在使用的不再有效并且已被消耗。
我还可以建议您使用Facebook 的 PHP SDK。这将减少开发您的应用程序并为您处理这些错误的时间。

于 2013-04-25T11:20:15.967 回答
1

我稍微修改了代码,以绕过问题..

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

   if ($params['access_token'] == NULL) {
         header("Location: " . $my_url);
   }

 $user = json_decode(file_get_contents($graph_url));
 }

因此,如果 access_token 无效,则“强制”页面在没有任何字符串查询的情况下重新加载并检索新的.. :) 这里也有一个有用的参考https://developers.facebook.com /blog/post/2011/05/13/how-to--handle-expired-access-tokens/ 非常感谢@Anvesh Saxena 的贡献

于 2013-04-26T07:25:53.350 回答