服务器端流程示例

时间:2011-09-08 04:13:35

标签: facebook cookies login option

底部是服务器端流程的工作示例。它是我在developers.facebook.com上找到的模板准备的文件fb_server_side_flow.php。我的第一个问题是$ code = $ _REQUEST [“code”]究竟是什么;在做什么?它是否获得了Facebook Cookie?如果是这样,$ code = $ _REQUEST [“code”]怎么样;不同于下面的代码?是否真的有必要在fb_server_side_flow.php的顶部使用session_start?

主要是我试图实现一个系统,为我的用户提供一个通过Facebook登录的选项,但不要求通过Facebook登录。是否有任何关于通过Facebook OPTION实施登录的文件,而不是通过Facebook进行登录?

谢谢!

....
function get_facebook_cookie($app_id, $app_secret) {
  $args = array();
  parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
  ksort($args);
  $payload = '';
  foreach ($args as $key => $value) {
    if ($key != 'sig') {
      $payload .= $key . '=' . $value;
    }
  }
  if (md5($payload . $app_secret) != $args['sig']) {
    return null;
  }
  return $args;
}

$cookie = get_facebook_cookie(YOUR_APP_ID, YOUR_APP_SECRET);
....

fb_server_side_flow.php
<?php 

   $app_id = "****";
   $app_secret = "****";
   $my_url = "http://www.sepserver.net/dsg/fb_server_side_flow.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.");
   }

 ?>

1 个答案:

答案 0 :(得分:1)

第一个代码块是为已经授权并登录的用户检索Facebook Cookie参数。

第二个代码块用于让用户授权您的应用程序(oauth)和用于检索您的应用程序可以用来代表用户进行API(FB Graph)调用的access_token。

$ _ REQUEST与POST或GET参数有关,而不是cookie。如果您查看authentication flow上的文档,则可以看到Facebook在用户批准您的应用程序后将用户重定向到http://your_redirect_uri?code=1234abcd。您应该获取该代码参数并使用它来再次调用graph.facebook.com来获取用户的access_token。

session_start()的目的是准备$ _SESSION数组,以便在页面重新加载时保留$ _SESSION ['state']。如果您的框架已有会话处理代码,则可以省略它。它仅用于CSRF保护位。

可选登录非常简单。如果您正在使用新的PHP SDK,则可以检查$facebook->getUser();的返回值 - 如果它为0,则用户未登录(并且您可以正常显示内容,可能还有一个指向fb_server_side_flow的链接.php开始授权程序。)