底部是服务器端流程的工作示例。它是我在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.");
}
?>
答案 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开始授权程序。)