Facebook redirect_uri在OAuth之后无法识别用户

时间:2012-02-14 15:29:37

标签: php facebook oauth-2.0

Facebook的OAuth令人难以置信......再次。我们有一个相当直接的系统:

  1. 用户使用OAuth“接收”Facebook权限(基本用户信息+扩展权限:在墙上书写)
  2. 通过自定义的redirect_uri,用户被重定向回我们的平台,用户信息存储在数据库中,用户也会使用我们自己的登录系统标记为“登录”。
  3. 然而,问题是有时(我重复:有时......)用户无法通过$ user = $ facebook-> getUser()识别;请求。只有设置了$ user,用户才会存储在数据库中,因为我们只知道用户已经过身份验证,并且能够使用$ facebook-> api('/ me');

    奇怪的是,在第一次试用后,系统会提示用户输入错误,但如果他们再次单击“使用Facebook登录”,则一切顺利。而且,并非所有用户都遇到此问题。在执行所有登录/帐户创建工作时,我感觉我的代码还没有“识别”用户登录。

    真的希望有人可以提供帮助,下面我发布了代码。

    
        INITIATION:
    
        $loginUrl = $facebook->getLoginUrl(array('scope' => 'friends_relationships,publish_stream,email,user_birthday,user_location,user_checkins,user_education_history,user_photos','redirect_uri' => 'REDIRECTED_PAGE.php'));
    
        RETURN PAGE (REDIRECT_PAGE.PHP)
    
        $fbuser = $facebook->getUser();
    
        if ($fbuser) {
          try {
            $user_profile = $facebook->api('/me');
          } catch (FacebookApiException $e) {
            error_log($e);
            $fbuser = null;
          }
        }
    
        $uid = $user_profile['id'];
    
        // -> here's the problem: $fbuser is either 0 or not set
    
        if (isset($fbuser) && $fbuser != '0') 
        {
         $dbc = new DBC();
         $dbc->connect(0, true);
         $fbemailquery = $dbc->executeQuery("SELECT * FROM users WHERE fbuid = '".$uid."'");
         if(!$dbc->isResultEmpty($fbemailquery)) { 
    
          // USER IS KNOWN, SO LOGIN
    
         }
         else { 
    
          // NEW USER
    
          $firstname = $user_profile['first_name']; // etc etc
         }
         $dbc->close();
        }
    
    

1 个答案:

答案 0 :(得分:0)

Facebook应用程序确实很棘手。您是否直接通过您的网站输入申请?或者您使用的是内部Facebook应用程序? (比如apps.facebook.com/application)。我问你这个因为facebook有一个不同的机制来处理身份验证,这取决于你是在你自己的网站上还是直接在facebook.com上第一个会要求你获得一个访问代码,这个代码嵌入在$ _REQUEST ['code']中var,您可以稍后交换访问令牌(具有您请求的权限)。但是,如果您通过facebook.com访问,则会通过POST将signed_request发送到您的应用程序画布URL,您必须对其进行解码以获取捆绑在其中的access_code(如果用户已经授权您的应用程序)或不存在(如果用户拒绝了您的应用。)