Php 未捕获的OAutheException:验证应用程序时出错

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”,即使用户(在本例中是我自己)已登录 请帮我解决这个问题 代码: 即使用户已登录,

我正在开发我的第一个facebook应用程序,其中包括创建一个新相册和将照片发布到用户墙上。通过学习facebook文档和一些教程,我得到了这段代码,但我发现了以下错误

致命错误:未捕获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'];
       }