iframe标签的Facebook应用在新页面中显示,而不是在iframe/facebook画布内
我正在使用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 个回答
在其他地方也提到过,但我再说清楚一点:你的应用程序之所以会跳出 Facebook,是因为认证对话框离开了原来的 apps.facebook.com 的网址。
这种情况可能只会在需要额外权限的时候发生,因为新的权限界面变成了两页,而不是一页。
一旦授权过程完成,浏览器会被重定向到你服务器上的完整应用网址。
解决办法是让浏览器返回到 Facebook 应用,使用这个地址:http://apps.facebook.com/appname。
[虽然这对大多数人来说似乎不是很顺畅,但现在就是这样。我觉得可能还有其他方法,比如在应用的“认证对话框”页面使用“认证推荐”,但我还没试过]
我使用 PHP SDK,以下是我的做法:
- 在授权后,当你的重定向网址被调用时,检查“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; }
如果你知道更好的方法,请告诉我!
关于标签页应用的一些未记录的步骤:
让人困惑的是示例中的 CANVAS_PAGE_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(),在 php 中是 header())。重定向需要指向粉丝页面上的应用地址: http://www.facebook.com/FAN_PAGE_NAME?sk=app_nnnnnnn
我花了很多小时研究和挖掘这些内容,希望这些信息能帮到你(我看到很多人问关于页面如何跳出 iframe/canvas 的问题),基本问题就是 Facebook 没有记录的额外重定向步骤……
(如果你有需要,可以给我发邮件,我很乐意分享现在已经正常工作的 python 代码)