【问题标题】:Server side flow example服务器端流程示例
【发布时间】:2011-11-12 16:05:27
【问题描述】:

底部是服务器端流程的工作示例。这是一个文件 fb_server_side_flow.php,它是我根据在 developers.facebook.com 上找到的模板准备的。我的第一个问题是 $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.");
   }

 ?>

【问题讨论】:

    标签: facebook cookies login option


    【解决方案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-&gt;getUser(); 的返回值——如果它为 0,则用户未登录(您可以正常显示内容,可能还有一个指向 fb_server_side_flow.php 的附加链接开始授权程序。)

    【讨论】:

    • 那是非常有见地的评论。谢谢你的回复。
    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 2011-03-21
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2011-01-30
    • 2021-03-02
    相关资源
    最近更新 更多