终于找到了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 父级(顶部窗口)交互并将所有必需的信息发送给父级!