终于找到了FB是怎么做到的:)
- page_proxy.php#frameName - 加载一个表单,然后使用 POST 方法加载带有签名请求的 iframe。
为什么没有直接调用用应用程序加载 iframe?防止第 3 方脚本获取签名请求(其中包含所有用户信息)。
fb是如何做到的(我采用的代码):
<form method="post" id="proxy_form"><input type="hidden" autocomplete="off" id="signed_request" name="signed_request" /></form>
<script>
  var frameName = window.location.href.split('#')[1];
  function submitForm(appTabUrl, signedRequest) {
    var proxyForm = document.getElementById("proxy_form");
    proxyForm.setAttribute("action", appTabUrl);
    proxyForm.setAttribute("target", frameName);
    var input = document.getElementById("signed_request");
    input.setAttribute("value", signedRequest);
    proxyForm.submit();
  }
  function waitForParams() {
    submitForm('$url_with_app', 'signed_request_goes_here');
  }
  waitForParams();</script>
- iFrame 中的应用程序正常加载,但我们在 DOM 浏览器中看不到 iframe 与我们的应用程序,因为它是使用 POST 请求加载的。 
- 我们在我们的应用程序中初始化 facebook 并告诉我们的应用程序自动增长。 
- Facebook 完成初始化,等待 DOM 准备好并计算应用程序的高度。 
- 现在是时候增加我们的 iframe 了。这是他们的伎俩: 
来源自FB
_sendMessageToFacebook: function(message) {
    var url = FB._domain.staticfb + 'connect/canvas_proxy.php#' +
      FB.QS.encode({method: message.method,
                    params: FB.JSON.stringify(message.params)});
     var root = FB.Content.appendHidden('');
     FB.Content.insertIframe({
       url: url,
       root: root,
       width: 1,
       height: 1,
       onload: function() {
         setTimeout(function() {
           root.parentNode.removeChild(root);
         }, 10);
       }
     });
  }
他们在我们的应用程序中加载了另一个 iframe,但该 iframe 已经属于 facebook,并且可以与 FB 父级(顶部窗口)交互并将所有必需的信息发送给父级!