iFrame App中的Facebook require_login()

时间:2010-03-29 13:10:49

标签: php api facebook iframe kohana

iframe应用程序存在严重问题。我需要使用许多外部JS库和其他动态stuuf,因此无法完成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 个答案:

答案 0 :(得分:1)

您正在查看的许多教程都已过时。 Facebook API和随附的SDK变化相当快,虽然这并不意味着不可能以“旧”的方式做事,但这些方式更有可能被破坏,弃用,删除或记录不足。< / p>

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

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

它向用户显示登录链接,但如果您处于要强制登录的上下文中,仅向登录用户显示内容(模仿旧require_login),则可以替换:< / p>

// 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()) ;
}

答案 1 :(得分:0)

Facebook限制了许多HTML标签的使用。您似乎在代码中使用了一些受限制的标记。你试过删除它们吗?

如果你想使用这些标签(例如<body>),请将其设为iframe应用程序而不是fbml ...