代码之家  ›  专栏  ›  技术社区  ›  Karol Janyst

Facebook需要在iFrame应用程序中登录

  •  0
  • Karol Janyst  · 技术社区  · 16 年前

    我对iframe应用程序有严重的问题。我需要使用许多外部JS库和其他动态stuf,因此FMBL应用程序无法完成。当我调用require_login()时,当应用程序尚未安装时,我会得到应用程序安装对话框,这是正常的。但在授权之后,应用程序进入一个无止境的重定向循环,其中包含auth_token、installed等参数。昨天我设法修好了,但今天又坏了。。。FB到底怎么了?找到一个解决方案让我抓狂,网上找到的解决方案似乎都没用。

    到目前为止,我试着:

    http://abhirama.wordpress.com/2010/03/07/facebook-iframe-xfbml-app/ (2010年3月7日!) http://forum.developers.facebook.com/viewtopic.php?pid=156092 http://www.keywordintellect.com/facebook-development/how-to-set-up-a-facebook-iframe-application-in-php-in-5-minutes/

    http://www.markdeepwell.com/2010/02/validating-a-facebook-session-within-an-iframe/ http://forum.developers.facebook.com/viewtopic.php?pid=210449 http://www.ajaxlines.com/ajax/stuff/article/facebook_fbml_rendering_in_iframe_application.php http://www.aratide.com/php/solving-the-break-out-issue-in-iframe-facebook-applications/

    以上都不起作用。。。根据这些和一些FB文件: http://wiki.developers.facebook.com/index.php/FB_RequireFeatures http://wiki.developers.facebook.com/index.php/Cross_Domain_Communication_Channel

    我的示例测试文件如下所示:

    <?php
    //Link in library.
    require_once '../application/vendor/Facebook/facebook.php';
    
    //Authentication Keys
    $appapikey = 'XXXX';
    $appsecret = 'XXXX';
    
    //Construct the class
    $facebook = new Facebook($appapikey, $appsecret);
    
    //Require login
    $user_id = $facebook->require_login();
    
    ?>
    
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">
    <head>
      <title></title>
    </head>
    <body>
      <script src="http://static.ak.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>
      This is you: <fb:name uid="<?php echo  $user_id?>"></fb:name>
      <?php var_dump($facebook->$this->facebook->api_client->friends_get())?>
      <script type="text/javascript">
     FB_RequireFeatures(["XFBML"], function(){
      FB.Facebook.init("<?=$appapikey?>", "xd_receiver.html");
     });
      </script>
    </body>
    </html>
    

    跨域文件xd_receiver.html是:

    <!doctype html public "-//w3c//dtd xhtml 1.0 strict//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
      <head>
        <title>cross-domain receiver page</title>
      </head>
      <body>
        <script src="http://static.ak.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"></script>
      </body>
    </html>
    

    我怎样才能让它工作?

    我正在使用Kohana框架来完成这项工作,并且已经用facebook php库中的url::redirect()替换了header('Location')。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Ben Regenspan    15 年前

    你看的很多教程都已经过时了。Facebook的API和附带的sdk变化相当快,虽然这并不意味着不可能以“旧”的方式来做事情,但这些方式更有可能被破坏、弃用、删除,或者没有很好的文档记录。

    为了获得更好的支持,请尝试升级到最新的PHP SDK: https://github.com/facebook/php-sdk/

    然后,您可以使用此示例作为尝试执行操作的基础: https://github.com/facebook/php-sdk/blob/master/examples/example.php

    它向用户提供了一个登录链接,但是如果您在一个要强制登录的上下文中,则只向登录的用户显示内容(模仿旧的 require_login ),您可以替换:

    // Login or logout url will be needed depending on current user state.
    if ($user) {
      $logoutUrl = $facebook->getLogoutUrl();
    } else {
      $loginUrl = $facebook->getLoginUrl();
    }
    

    使用:

    // Get logout URL, or redirect user to login URL
    if ($user) {
      $logoutUrl = $facebook->getLogoutUrl();
    } else {
      header('Location: ' . $facebook->getLoginUrl()) ;
    }
    
        2
  •  0
  •   Yash    16 年前

    Facebook限制了许多HTML标签的使用。似乎您在代码中使用了一些受限制的标记。你试过把那些拿走吗?

    如果你想用那些标签( <body> 例如)使其成为iframe应用程序而不是fbml。。。

    推荐文章