Facebook标签与脂肪免费框架


Facebook Tab with Fat Free Framework

当我们尝试将页面输出到facebook选项卡时,是否有一些限制?

我已经尝试了下面的代码,不幸的是,在facebook标签iframe总是空的空白页。

<?php
$f3=require('app/lib/base.php');
require_once 'app/lib/fb/facebook.php';
$f3->route('GET /',
    function() {
        echo 'Hello';
    }
);
$f3->route('GET /landing',
    function() {
        $app_id = 'xxxx';
        $secret_key = 'yyyy';
        $page_id = 'zzzz';
        $config = array(
            'appId' => $app_id,
            'secret' => $secret_key
        );
        $fb = new Facebook($config);
        $fbdata = $fb->getSignedRequest();
        $fbInPage = false;
        if(!empty($fbdata) && is_array($fbdata)
            && !empty($fbdata['page']) && is_array($fbdata['page'])
            && !empty($fbdata['page']['id'])
        ) {
            $fbInPage = $fbdata['page']['id'];
        }
        // Check if user not in fb tab
        if(!$fbInPage) {
            // Redirect to facebook tab
            echo '<script>window.location.href="https://www.facebook.com/'.
                $page_id.
                '?sk=app_'.
                $app_id.
                '"</script>';
            exit;
        }
        // Get User ID
        $user = $fb->getUser();
        // Check if user not connected to facebook
        if ($user) {
            try {
                $user_data = $fb->api("/me");
            } catch (FacebookApiException $e) {
                $user_data = null;
            }
        } else {
            // Asking permission for email and user_likes
            $fb_login_url = $fb->getLoginUrl(array(
                'scope' => 'email, user_likes'
            ));
            echo '<script>top.location.href = "'.$fb_login_url.'"</script>';
            exit;
        }
    }
);
$f3->run();

首先,当用户尝试访问GET /landing时,它将重定向到facebook选项卡并显示GET /页面。但不知何故,它总是返回空页,已经用firebug在firefox上检查它,没有错误,在响应选项卡上总是显示Reload the page to get source for: https://localhost/f3-fb/。已经在我的办公室框架中尝试过了,效果很好。

如果有人遇到这个问题,请告诉我。

问题是在XFRAME中,默认情况下F3将XFRAME的值设置为SAME-ORIGIN,基于此文档,开发人员必须重载ALLOW-FROM uri的值。

下面是index.php的完整代码:
<?php
$f3=require('app/lib/base.php');
require_once 'app/lib/fb/facebook.php';
$f3->set('XFRAME', 'ALLOW-FROM https://localhost/f3-fb/');
$f3->route('POST /',
    function() {
        echo 'Hello';
    }
);
$f3->route('GET /landing',
    function() {
        $app_id = 'xxxx';
        $secret_key = 'yyyy';
        $page_id = 'zzzz';
        $config = array(
            'appId' => $app_id,
            'secret' => $secret_key
        );
        $fb = new Facebook($config);
        $fbdata = $fb->getSignedRequest();
        $fbInPage = false;
        if(!empty($fbdata) && is_array($fbdata)
            && !empty($fbdata['page']) && is_array($fbdata['page'])
            && !empty($fbdata['page']['id'])
        ) {
            $fbInPage = $fbdata['page']['id'];
        }
        // Check if user not in fb tab
        if(!$fbInPage) {
            // Redirect to facebook tab
            echo '<script>window.location.href="https://www.facebook.com/'.
                $page_id.
                '?sk=app_'.
                $app_id.
                '"</script>';
            exit;
        }
        // Get User ID
        $user = $fb->getUser();
        // Check if user not connected to facebook
        if ($user) {
            try {
                $user_data = $fb->api("/me");
            } catch (FacebookApiException $e) {
                $user_data = null;
            }
        } else {
            // Asking permission for email and user_likes
            $fb_login_url = $fb->getLoginUrl(array(
                'scope' => 'email, user_likes'
            ));
            echo '<script>top.location.href = "'.$fb_login_url.'"</script>';
            exit;
        }
    }
);
$f3->run();

添加配置$f3->set('XFRAME', 'ALLOW-FROM https://localhost/f3-fb/');以允许此url在facebook iframe内。

并且总是使用POST的路由在facebook iframe(仍然不知道为什么必须使用F3,但它会发生错误,并要求POST路由)