iframe 选项卡 Facebook 应用程序显示在新页面上,而不是在 iframe/facebook-canvas 内

Posted

技术标签:

【中文标题】iframe 选项卡 Facebook 应用程序显示在新页面上,而不是在 iframe/facebook-canvas 内【英文标题】:iframe tab facebook app displays on a new page instead of within the iframe/facebook-canvas 【发布时间】:2012-01-06 17:05:50 【问题描述】:

我正在使用 Python 和一个 javascriptphp sdk。

要获取 access_token - 我按照文档页面 (https://developers.facebook.com/docs/authentication/) 上指示的步骤进行操作。我将重定向 url 传递给 dialog/oauth 并获得了 access_token。完成此操作后,发送回浏览器的所有输出 html 都会呈现到新页面,留下 facebook iframe/canvas。 (仅供参考,所有输出都是通过通常的“self.response.out.write”函数调用完成的)。

似乎 PHP sdk 隐藏了这一点,我找不到方法来获取:http://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s" 对话框以将重定向 url 的输出发送到触发应用程序的 iframe/canvas。这是一个“页面选项卡”应用程序(不是“Facebook 上的应用程序”),因此在基本应用程序配置页面上设置了“页面标签名称”和“页面标签网址”。

我还没有实现会话,我想知道是否有必要将 iframe 目标作为状态变量传递,并将其与重定向一起传递回 uri。

我搜索了很多帖子/等,但没有运气,任何帮助将不胜感激!

【问题讨论】:

经过更多研究 - facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s 被重定向到增强的权限对话框(请参阅博客 developers.facebook.com/blog/post/378)。这可能会强制对话框显示为新页面,而不是启动应用程序的原始 fb iframe/canvas 上的新对话框。因此,来自此处的重定向将转到 FB 画布之外的新页面。有一种方法可以禁用增强的权限对话框,但我无法阻止权限对话框出现。继续为此奋斗..欢迎任何帮助。 终于在查看了 php sdk 之后 - 在 FB 页面上发现了这个严重未记录的问题。 /* * 如果用户第一次验证应用程序 facebook * 将用户重定向到 baseUrl,所以我检查是否有任何代码通过 * 然后将他重定向到应用程序 url * -mahmud */ if (isset($_GET['code'])) header("位置:" . $fbconfig['appBaseUrl']);出口; //~~ 基本上你必须做一个重定向或标题到原始粉丝页面并再次触发应用程序。这会调用带有 signed_request 和必要数据的 url 以继续前进。 现在,我很难让它在生产中工作(它与 local:8080 一起工作,但是一旦在网络上,fb 不会在重定向后发送 sign_request(标头调用))。 . 继续研究。将详细发布所有调查结果.. 【参考方案1】:

标签页应用程序未记录的步骤:

    令人困惑的部分是示例中的 CANVAS_PAGE_URL。这需要是 Web 托管的应用 URL(例如 https://www.appname.appspot.com/)。这没有明确定义..

    如果在 signed_request 上找不到 access_token 和 user_id,则需要进行身份验证对话框(根据页面文档)。这需要通过脚本 top.location.ref 来完成,以忍受它作为对话框启动。这会转到一个新页面,该页面会覆盖触发该应用的画布(或粉丝页面)。

    当用户允许应用程序的权限时,应用程序通过 tab-page-canvas-url?code="....." 调用。此时,需要进行重定向(在任何地方都没有记录。我不得不查看 php sdk 代码来解决这个问题(fbmain.php 第 17 行)(python 中的 redirect() 和 header() php)。重定向需要获取粉丝页面上应用的url:http://www.facebook.com/FAN_PAGE_NAME?sk=app_nnnnnnn

花了很多时间研究和挖掘来理解这一点并希望它有所帮助(我看到很多关于页面突破 iframe/canvas 的问题),基本问题是 FB 没有记录的额外重定向步骤任何地方...

(给我发邮件,我很高兴分享现在运行良好的 python 代码)

【讨论】:

【参考方案2】:

在别处有说明,但要明确一点:您的应用脱离 facebook 的原因是身份验证对话框脱离了原始的 apps.facebook.com url。

这可能只发生在扩展权限的情况下,因为新权限屏幕是两页而不是一页。

授权过程完成后,浏览器将重定向到您服务器上的完全限定应用网址。

“修复”是使用其http://apps.facebook.com/appname 地址将浏览器发送回 Facebook 应用程序。

[对大多数人来说,这似乎不是很好的“流动”,但现在就是这样。我认为通过应用程序的“Auth Dialog”页面上的“Authenticated Referrals”可能会有不同的路线,但尚未使用它]

我使用 PHP SDK,这就是我所做的:

    在授权后调用redirct_url 时检查“state”请求参数。有人建议使用“code”参数,但我没有看到它被返回。

''

// after completing the first authorization, the redirect url may send users away from Facebook to the redirect url itself.    
//This php code redirects them back to the app page

if (isset($_GET['state'])) header("Location: http://apps.facebook.com/appname']); exit; 

如果你知道更好的方法,请告诉我!

【讨论】:

以上是关于iframe 选项卡 Facebook 应用程序显示在新页面上,而不是在 iframe/facebook-canvas 内的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 更改Facebook iframe选项卡大小

Facebook IFrame选项卡调整大小修复

如何在简单的 iframe 选项卡中提示用户访问用户 ID?

像时间线页面选项卡中的详细页面

仅刷新包含 iframe 的引导程序中的当前导航选项卡

在 facebook 页面的选项卡中查看 facebook 应用程序时不显示任何内容