Php 未捕获的OAutheException:验证应用程序时出错
我正在开发我的第一个facebook应用程序,其中包括创建一个新相册和将照片发布到用户墙上。通过学习facebook文档和一些教程,我得到了这段代码,但我发现了以下错误Php 未捕获的OAutheException:验证应用程序时出错,php,facebook,facebook-graph-api,Php,Facebook,Facebook Graph Api,我正在开发我的第一个facebook应用程序,其中包括创建一个新相册和将照片发布到用户墙上。通过学习facebook文档和一些教程,我得到了这段代码,但我发现了以下错误 致命错误:未捕获OAutheException:验证应用程序时出错。在1106行的/home/base_facebook.php中抛出 另外:我不知道这是否重要,但当我打印出 echo$facebook->getUser() 变量it返回给我“0”,即使用户(在本例中是我自己)已登录 请帮我解决这个问题 代码: 即使用户已登录,
致命错误:未捕获OAutheException:验证应用程序时出错。在1106行的/home/base_facebook.php中抛出
另外:我不知道这是否重要,但当我打印出
echo$facebook->getUser()代码>
变量it返回给我“0”,即使用户(在本例中是我自己)已登录
请帮我解决这个问题
代码:
即使用户已登录,用户也需要授予您的应用权限,然后您才能进行api调用
基本上,使用facebook php sdk进行用户身份验证的流程应该如下所示:
检测用户是否已登录并授予您的应用权限
如果他没有授予权限,请将他重定向到登录和应用程序权限页面。登录并授予权限后,他将再次重定向回您的应用程序页面
否则,显示应用程序的内容,进行api调用
以下是php sdk文档页面中修改的示例代码,用于处理身份验证,如果只修改appId、appSecret和redirect_uri,则该验证应该可以工作:
<?php
require_once 'fb_php_sdk/facebook.php';
$appId = 'your_app_id';
$appSecret = 'your_app_secret';
// Create your Application instance (replace this with your appId and secret).
$facebook = new Facebook(
array(
'appId' => $appId,
'secret' => $appSecret,
'fileUpload' => true,
'cookie' => true
));
// Get User ID
$user = $facebook->getUser();
if ($user)
{
try {
// Proceed knowing you have a logged in user who's authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
// Login or logout url will be needed depending on current user state.
if ($user)
{
$logoutUrl = $facebook->getLogoutUrl();
}
else
{
$loginUrl = $facebook->getLoginUrl(
array(
'canvas' => 1,
'fbconnect' => 0,
'scope' => '',//these are the extended permissions you will need for your app, add/remove according to your requirement
'redirect_uri' => 'http://apps.facebook.com/test_app_azk/',//this is the redirect uri where user will be redirected after allow,
));
}
if ($user)
{
//show the content of your app
//make api calls
var_dump($user_profile);
}
else
{
//redirect user to loginUrl
echo "<script>parent.location = '".$loginUrl."';</script>";
}
问题可能出在else语句中。使用if(!user)代替else。这应该可以解决问题。这是我在网络上找到的最好的解决方案。在php页面顶部添加以下代码:
$app_id = "YOUR_APP_ID";
$app_secret = "YOUR_APP_SECRET";
$my_url = "YOUR_URL";
$code = $_REQUEST["code"];
if(empty($code)) {
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$dialog_url = "http://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'];
}
$app\u id=“你的app\u id”;
$app\u secret=“您的app\u secret”;
$my\u url=“您的url”;
$code=$_请求[“code”];
if(空($code)){
$_SESSION['state']=md5(uniqid(rand(),TRUE));//CSRF保护
$dialog_url=”http://www.facebook.com/dialog/oauth?client_id="
.$app\u id.&redirect\u uri=“.urlencode($my\u url)。”&state=”
.u会话[“状态];
echo(“top.location.href=”。$dialog\u url。””;
}
if($\u请求['state']=$\u会话['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\u get\u contents($token\u url);
$params=null;
parse_str($response,$params);
$graph_url=”https://graph.facebook.com/me?access_token="
.$params['access_token'];
}
如果我没有错,则在用户首次授权应用程序时授予权限。。用户不需要在每次使用应用程序时都给予许可,或者他需要吗?如果是第一种情况,用户是否已授权应用程序?请把它弄清楚。是的,你是对的。用户只有在首次访问您的应用程序时才需要授予权限。之后,将用户重定向到loginUrl将带他返回应用程序页面,并使用有效的access\u令牌,该令牌将使应用程序能够进行api调用。请您指导我如何在经过身份验证并重定向到应用程序页面后检索“access\u令牌”?实际上,您不必担心自己处理“access\u令牌”。PHPSDK处理这些东西。无论何时使用$facebook->api()进行api调用,sdk都会使用访问令牌。在进行此调用时,您当前得到了什么:$facebook->api('/me')我找到了解决早期错误的方法,但现在我得到了此错误:OAutheException:必须使用活动访问令牌来查询有关当前用户的信息。
。。我为什么要这么做?
$app_id = "YOUR_APP_ID";
$app_secret = "YOUR_APP_SECRET";
$my_url = "YOUR_URL";
$code = $_REQUEST["code"];
if(empty($code)) {
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$dialog_url = "http://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'];
}