Facebook Iframe应用认证?

时间:2011-01-13 09:07:53

标签: php facebook facebook-graph-api

我开发了一个在Facebook画布中的iframe内运行的Facebook应用程序。为了使其正常工作,我请求用户的扩展权限。如果用户未授权应用程序,我将他/她发送到PHP SDK中带有getLoginUrl()方法的登录页面。

它有效,但它并不漂亮。该方法在验证页面之前将用户发送到登录页面。它看起来像这样:

Facebook Landing Page

当我点击“转到Facebook.com”时,我会看到权限请求的实际页面(如果我打印了网址,我也可以访问权限页面,将其复制并输入新的浏览器窗口)。当我从iframe进行重定向时,如何让Facebook跳过此步骤?

我的代码看起来像这样(使用CodeIgniter和Facebook PHP SDK):

$this->facebook = new Facebook(array(
  'appId'  => '{MY_APP_ID}',
  'secret' => '{MY_SECRET}',
  'cookie' => TRUE,
  'domain' => $_SERVER['SERVER_NAME']
));

$this->facebook->getSession();

try {
  $this->me = $this->facebook->api('/me');
}
catch (FacebookApiException $e) {
  $this->me = NULL;
}

if ( is_null($this->me) ) {
  redirect($this->facebook->getLoginUrl(array(
    'req_perms' => 'offline_access,read_stream,publish_stream,user_photos,user_videos,read_friendlists',
    'next' => $this->config->item('base_url').'fblogin.php?redirect_uri='.$this->uri->uri_string()
  )));
}

2 个答案:

答案 0 :(得分:4)

我认为您需要重定向父框架(即_top)而不是iFrame本身?

答案 1 :(得分:0)

我这样做的方法是使用以下

设置INDEX.PHP文件
  

    //if user is logged in and session is valid.
    if ($fbme){
        //fql query example using legacy method call and passing
     

参数               尝试{                   $ fql =“选择姓名,hometown_location,性别,   来自用户的pic_square,其中uid =“。   $ UID;                   $ param = array(                       'method'=> 'fql.query',                       'query'=> $ FQL,                       'callback'=> 'http://apps.facebook.com/yoursite/'                   );                   $ fqlResult = $ facebook-> api($ param);               }               catch(Exception $ o){                   d($ O);               }           }

然后将您的画布网址指向http://yoursite.com/INDEX.php

上面代码中的回调网址将在INDEX.PHP中设置授予权限的位置。

FBMain.php看起来像这样

  

//set application urls here
$fbconfig['http://www.yoursite.com/iframeapp/YOURMAINPAGE.php/']
     

=“http://www.tyoursite.com/YOURMAINPAGE.php/”;

$fbconfig['http://apps.facebook.com/CANVASBASEURL']
     

=“http://apps.facebook.com/CANVASBASEURL”;

$uid            =   null; //facebook user id

try{
    include_once "facebook.php";
}
catch(Exception $o){
    echo '<pre>';
    print_r($o);
    echo '</pre>';
}
// Create our Application instance.
$facebook = new Facebook(array(
  'appId'  => $fbconfig['APPID'],
  'secret' => $fbconfig['SECRET'],
  'cookie' => true,
));

//Facebook Authentication part
$session = $facebook->getSession();
$loginUrl = $facebook->getLoginUrl(
        array(
        'canvas'    => 1,
        'fbconnect' => 0,
        'req_perms'=>'email,publish_stream,status_update,user_birthday,user_location'
        )
);

$fbme = null;

if (!$session) {
    echo "<script type='text/javascript'>top.location.href
     

='$ loginUrl';“;           出口;       }       其他{           尝试{               $ uid = $ facebook-&gt; getUser();               $ fbme = $ facebook-&gt; api('/ me');

    } catch (FacebookApiException $e) {
        echo "<script type='text/javascript'>top.location.href
     

='$ loginUrl';“;               出口;           }       }

function d($d){
    echo '<pre>';
    print_r($d);
    echo '</pre>';
} ?>

希望它更清楚一些。我花了一段时间来弄明白,但我到了那里,以为我会帮忙。