Php 如何通过facebook认证以编程方式获取用户数据?
我可以手动获取用户的数据,但不能编程 使用服务器端代码(原样),从- PHP版本=5.2.9 错误报告处于关闭状态,但将其包含在代码-Error_reportingE_ALL中;没有输出。Php 如何通过facebook认证以编程方式获取用户数据?,php,facebook,facebook-authentication,Php,Facebook,Facebook Authentication,我可以手动获取用户的数据,但不能编程 使用服务器端代码(原样),从- PHP版本=5.2.9 错误报告处于关闭状态,但将其包含在代码-Error_reportingE_ALL中;没有输出。 更新-所以,我尝试了6个月后,它的工作。唯一改变的是我的主机。我以前用过HostBig。教训-不要依赖每月1美元的托管服务,它们是不可信任的。您正在尝试从本地主机运行此代码吗?如果是的话,它就不起作用了。在facebook上注册应用程序时,您必须已进入应用程序的网站。将脚本上传到服务器上,编辑你的应用程序id
更新-所以,我尝试了6个月后,它的工作。唯一改变的是我的主机。我以前用过HostBig。教训-不要依赖每月1美元的托管服务,它们是不可信任的。您正在尝试从本地主机运行此代码吗?如果是的话,它就不起作用了。在facebook上注册应用程序时,您必须已进入应用程序的网站。将脚本上传到服务器上,编辑你的应用程序id、密码和脚本的url。然后尝试执行它
如果即使在那时也不起作用,那么尝试回显您的$dialog\u url和$token\u url。首先在浏览器中手动复制粘贴您的$dialog\u url,并查看它会出现什么错误。如果它要求验证,请验证您的应用程序。它会让你回到页面。然后尝试在浏览器中运行$token\u url。它将为您提供服务器为您提供的准确响应。因此,我在6个月后尝试了这一方法,并且成功了。唯一改变的是我的主机。我以前用过HostBig HostBig的PHP配置可能有问题,它禁用了文件的内容
更新-我和主机大人物谈过,他们告诉我,出于安全考虑,他们已经禁用了allow_url_fopen,并建议使用cURL作为更安全的选择。Hrm,您在没有@的情况下尝试过吗?这就是抑制错误。我过去对文件内容的一个问题是,当响应头包含错误时,它不会提供实际的Web服务器响应数据。然而,浏览器通常会显示响应。这并不能使调试变得更容易。@finity我在没有“@”的情况下尝试过。事实上,在几个小时的时间跨度内,我已经尝试了许多这种代码的排列/组合!什么都不管用。我可以避免使用file\u get\u contents函数,而使用其他函数吗?是的,可以使用curl-。几个月前,我写了一个Facebook应用程序,并花了很长时间调试它。Facebook曾一度停止响应我的查询,几天后我发现这是一个bug,可能会攻击100名开发人员。非常令人沮丧。你使用的身份验证方案与我的不同——我的身份验证方案以画布应用程序的形式运行,因此每次用户查看我的页面时,Facebook都会向我发送访问令牌。file\u get\u内容对我来说很好,但也许curl可以为您提供更多有用的调试信息。我正在服务器上运行。就像我说的,当我回显$token_url并将其粘贴到地址栏时,我得到了令牌和到期时间。我还使用该令牌以同样的方式从图表中获取信息。
<?php
$app_id = "MY_APP_ID";
$app_secret = "MY_APP_SECRET";
$my_url = "ADDRESS_OF_CURRENT_PAGE";
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.");
}
?>
$response = @file_get_contents($token_url);