阻止Facebook Tab应用程序在iframe之外运行

时间:2013-05-10 16:56:53

标签: facebook tabs facebook-php-sdk

我使用PHP SDK开发了一个facebook粉丝页面应用程序并成功运行它。我有一个Fan Gate实现,也就是说,用户必须先喜欢该页面才能使用该应用程序。

到目前为止我无法解决的问题是:我想阻止我的应用程序在Facebook iframe之外运行。截至目前,当用户复制并粘贴URL(iframe src)时,我的应用程序可以在新的浏览器选项卡或窗口中运行。在这一点上,我想给出一条错误消息,例如“此应用只能在Facebook标签页中运行”。

我正在捕捉signed_request,但由于我的应用程序有子页面和例程,我必须将signed_request存储在会话变量中。

有任何建议吗?

1 个答案:

答案 0 :(得分:0)

好的,我通常做的是在app_data的{​​{1}}字段中提供数据,以了解要加载的页面。 POST时,我在处理有效负载后直接重定向到选项卡。

因此,有两种方法可以请求一个页面,实际上是一个facebook标签:GET和POST。

获取

使用GET时,应始终使用facebook URL请求标签。例如:标签的子页面“表单”应该包含以下网址:http://www.facebook.com/pages/xXx/ [page_id]?sk = app_ [app_id]& app_data = form

在服务器端代码中,您在解码signed_request后识别app_data中的数据(请参阅12)。 在指向表单页面的链接中,还必须添加signed_request属性。 这样,Facebook重新加载,标签比直接链接子页面时感觉慢。但是您有标识子页面的URL,这是我们的首选。 此外,您可以预期每个GET请求都有target="parent"。如果没有,则不通过Facebook调用,您可以显示错误消息,或者我建议重定向到您的选项卡(子页面)。

发表

POST永远不会有signed_request。但通常,在浏览时,浏览器会使用GET请求。因此,您可以假设,如果您收到POST请求,则可能来自您自己的表单或黑客尝试。 在这两种情况下,都要检查该请求的有效性值。

如果有效,则将其保存到您的数据库并重定向到“成功”页面。例如。如果您参加比赛,您应该显示一个页面,确保用户他/她已成功参加。

如果数据无效,则会将错误消息保存到会话中并重定向回显示它们的表单。

我总是建议您在POST请求后重定向,无论您是否在facebook标签中。但是在facebook选项卡中,重定向必须使用javascript来完成,因为它在IFRAME中并且您希望整个页面重新加载:

signed_request

发布脚本1:对我来说,表单总是使用POST请求。

Post scriptum 2:如果你不喜欢每次点击重新加载整个facebook“框架”的想法,你可以考虑做一些AJAX魔术,其中请求是“加香”的有额外的数据,你可以将它们识别为“你的”。