【问题标题】:Facebook Iframe application authentication?Facebook iframe 应用程序身份验证?
【发布时间】:2011-01-15 01:32:00
【问题描述】:

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

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

当我单击“转到 Facebook.com”时,我会看到权限请求的实际页面(如果我打印 url,我也可以直接进入权限页面,将其复制并输入到新的浏览器窗口中)。当我从 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()
  )));
}

【问题讨论】:

    标签: php facebook facebook-graph-api


    【解决方案1】:

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

    【讨论】:

    • 我重定向到一个新的内部页面,该页面使用 Javascript 在新窗口中打开登录链接。谢谢!
    • 没问题!祝你好运:)
    • 重定向到父框架有效。但随后它加载了我的整个应用程序,而没有周围的 facebook 页面。
    • 重定向_top 是预期的解决方案,Facebook 似乎希望我们自己处理后续重定向。问题 4994286 (stackoverflow.com/questions/4994286/…) 正在讨论同一点。
    【解决方案2】:

    我这样做的方法是使用以下内容设置一个 INDEX.PHP 文件

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

    参数 尝试{ $fql = "选择姓名、家乡位置、性别、 来自 uid=" 的用户的 pic_square。 $uid; $参数 = 数组( '方法' => 'fql.query', '查询' => $fql, '回调' => 'http://apps.facebook.com/yoursite/' ); $fqlResult = $facebook->api($param); } 捕获(异常 $o){ d($o); } }

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

    上面代码中的回调 url 将在 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->getUser(); $fbme = $facebook->api('/me');

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

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

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

    希望它更清楚一点。我花了一段时间才弄清楚,但我到了那里,以为我会提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-23
      • 2012-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多