Facebook Iframe应用程序认证?

4
我开发了一个Facebook应用程序,它在Facebook画布内的iframe中运行。为了使其正常工作,我会向用户请求扩展权限。如果用户未授权该应用程序,则使用PHP SDK中的getLoginUrl()方法将其发送到登录页面。
它可以正常工作,但不太美观。该方法会将用户发送到认证页面之前的着陆页。效果如下图所示:
(图片链接:https://istack.dev59.com/bZN0u.webp)
当我点击“转到Facebook.com”时,我会看到实际的权限请求页面(如果我打印url并将其复制并输入到新的浏览器窗口中,我也可以直接进入权限页面)。如何让Facebook在从Iframe重定向时跳过此步骤?
我的代码如下(使用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个回答

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

我被重定向到一个新的内部页面,该页面使用Javascript在新窗口中打开了登录链接。谢谢! - Christoffer
没问题!祝你余下的工作顺利 :) - Robarondaz
重定向到父框架是有效的。但是它会加载整个应用程序,而不包括 Facebook 页面周围的内容。 - Erik
重定向到 _top 是预期的解决方案,而且似乎 Facebook 希望我们自己处理后续的重定向。问题 4994286 (http://stackoverflow.com/questions/4994286/facebook-iframe-application-redirect) 正在讨论同一点。 - Owen Blacker

0

我做的方式是设置一个包含以下内容的INDEX.PHP文件

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

parameter try{ $fql = "select name, hometown_location, sex, pic_square from user where 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';"; exit; } else { try { $uid = $facebook->getUser(); $fbme = $facebook->api('/me');

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

= '$loginUrl';"; exit; } }

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

希望现在更清楚了。我花了一些时间才理解,但最终弄明白了,想着能帮到你们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接