如果用户刷新页面,Facebook服务器登录不会检索信息

时间:2013-04-25 11:05:57

标签: php facebook facebook-login

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

<?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 ??

2 个答案:

答案 0 :(得分:1)

这种情况会导致您使用的$code不再有效且已被使用 我也建议您使用Facebook's PHP SDK。这将缩短开发应用程序的时间并为您处理这些错误。

答案 1 :(得分: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的贡献