iframe标签的Facebook应用在新页面中显示,而不是在iframe/facebook画布内

2 投票
2 回答
689 浏览
提问于 2025-04-17 07:05

我正在使用Python和一个JavaScript或PHP的开发工具包。

为了获取访问令牌(access_token),我按照文档页面上的步骤操作(https://developers.facebook.com/docs/authentication/)。我把重定向的URL传给dialog/oauth,然后得到了访问令牌。一旦完成,所有返回给浏览器的HTML内容都会被渲染到一个新页面上,这样就离开了Facebook的iframe/canvas。(顺便说一下,所有输出都是通过常规的'self.response.out.write'函数调用完成的。)

看起来PHP的开发工具包隐藏了这个过程,我找不到方法来获取这个对话框:http://www.facebook.com/dialog/oauth?client_id=%s&redirect_uri=%s,以便将重定向URL的输出发送回触发应用程序的iframe/canvas。这个是一个“页面标签”应用(而不是“Facebook上的应用”),所以我在基本应用配置页面上设置了“页面标签名称”和“页面标签URL”。

我还没有实现会话功能,我在想是否有必要将iframe目标作为状态变量传递,并在重定向到URI时一起返回。

我搜索了很多帖子等,但没有找到解决办法,任何帮助都将非常感激!!

2 个回答

0

在其他地方也提到过,但我再说清楚一点:你的应用程序之所以会跳出 Facebook,是因为认证对话框离开了原来的 apps.facebook.com 的网址。

这种情况可能只会在需要额外权限的时候发生,因为新的权限界面变成了两页,而不是一页。

一旦授权过程完成,浏览器会被重定向到你服务器上的完整应用网址。

解决办法是让浏览器返回到 Facebook 应用,使用这个地址:http://apps.facebook.com/appname

[虽然这对大多数人来说似乎不是很顺畅,但现在就是这样。我觉得可能还有其他方法,比如在应用的“认证对话框”页面使用“认证推荐”,但我还没试过]

我使用 PHP SDK,以下是我的做法:

  1. 在授权后,当你的重定向网址被调用时,检查“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; }

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

2

关于标签页应用的一些未记录的步骤:

  1. 让人困惑的是示例中的 CANVAS_PAGE_URL。这应该是你在网上托管的应用的地址(比如 https://www.appname.appspot.com/)。这个地方没有明确说明。

  2. 如果在 signed_request 中找不到 access_token 和 user_id,就需要进行一次授权对话框(根据页面的说明)。这需要通过脚本中的 top.location.ref 来确保它作为对话框启动。这会打开一个新页面,覆盖掉触发应用的画布(或者粉丝页面)。

  3. 当用户允许应用的权限后,应用会通过 tab-page-canvas-url?code="....." 被调用。此时,需要进行一次重定向(这个地方没有任何文档说明。我不得不查看 php sdk 的代码来搞明白这一点(fbmain.php 第17行)(在 python 中是 redirect(),在 php 中是 header())。重定向需要指向粉丝页面上的应用地址: http://www.facebook.com/FAN_PAGE_NAME?sk=app_nnnnnnn

我花了很多小时研究和挖掘这些内容,希望这些信息能帮到你(我看到很多人问关于页面如何跳出 iframe/canvas 的问题),基本问题就是 Facebook 没有记录的额外重定向步骤……

(如果你有需要,可以给我发邮件,我很乐意分享现在已经正常工作的 python 代码)

撰写回答