单击链接时缓慢加载 Facebook 画布应用程序(如果目标顶部)

Posted

技术标签:

【中文标题】单击链接时缓慢加载 Facebook 画布应用程序(如果目标顶部)【英文标题】:Slow load facebook canvas app when click on links (if target top) 【发布时间】:2012-04-06 09:05:04 【问题描述】:

情况:我正在开发一个 facebook 画布应用程序。每次呈现页面时,Facebook 都会向我的服务器发送带有 signed_request 的 POST 请求。在我的应用程序中,我的所有链接都带有 target="_top",因为如果我不这样做,facebook 会向我的服务器发送一个没有签名请求的通用 GET。所以无法查看用户信息。

问题:太慢了!即使我在本地测试它,我按下的每次点击都需要 1 秒来渲染,我的画布会变成完全白色,然后显示信息,这将是一个糟糕的用户体验。

我的测试:如果我删除 target=_top 并将所有链接的 href 指向我的服务器而不使用 app.facebook.com/whatever,它会非常快速地加载。

我的疑问:这有什么安全问题吗?如果我将所有链接都指向我的服务器(没有apps.facebook.com),我无法检查签名的请求,我只会在主页中检查它..

有什么建议吗?任何教程?我对这个有什么误解吗? (这是我的第一个 Facebook 应用)

【问题讨论】:

【参考方案1】:

您阅读过Server-Side Authentication 教程吗? 你做错了。

一旦用户登陆您的应用程序,您应该将所有链接保持在同一框架中,与 facebook 一起加载整个窗口是完全多余的。

你应该做什么:

当您获得带有签名请求的 POST 时,对其进行解码并检查用户是否已通过身份验证,他是否将数据(令牌等)保存在某处(会话、数据库、缓存)。 如果他未通过身份验证,请按照教程中的说明将他发送到身份验证对话框,当他回来时,将您获得的代码(在 GET 中)交换为令牌(也在教程中显示),然后将他重定向到 http(s): //apps.facebook.com/YOUR_APP,您将收到经过身份验证的签名请求,保存等。

由于您持久化了数据,因此在每个不是 POST 或不包含 signed_request 的请求中,请检查您对数据的持久性选择,然后使用它。

facebook 应该只有两次向您发送请求,一次是在您的画布加载时为 POST,第二次是当用户从身份验证对话框返回时,您可以在其中获得 代码 em> 参数或错误,以防用户拒绝身份验证。 其他请求应该从您的应用(在 iframe 内)进入应用服务器。

【讨论】:

嗨 Nizan,真诚地我已经阅读了很多文档,但没有关于 iframe 内页面之间链接的文档(甚至没有明确的示例)我正在使用 fandjango+facetools。我已经“阅读文档”并且在 facetools 的示例中,他们将 target=_top 放在应用程序的所有链接中......它也很慢。 (这与你所说的不同) 怀疑:http(s)://apps.facebook.com/YOUR_APP -> server/main/ 其他页面:server/main/polls/ server/main/polls/1/结果/我检查 signed_request 并制作您在 server/main/ 中所说的所有逻辑如果我直接访问会发生什么:apps.facebook.com/YOUR_APP/polls/ 我对 fandjango 或 facetools 都不熟悉,但是当在 iframe 中时,您的应用程序应该像往常一样运行,不与父 facebook 框架交互,与 facebook 交互的唯一方式是使用 js sdk 或通过服务器端 api 调用。【参考方案2】:

JDL,

我相信您在每次请求时都在查询图形 API(这就是为什么您总是需要 signed_request)。是这样吗?

图形 API 非常慢(约 1 秒/查询),您应该仅在必要时使用。例如,当您第一次收到 access_token 时,您应该将其保存在会话中并查询图形 API 以检索相应的 facebook 用户信息。但是你应该把你需要的关于这个用户的信息放在你的会话中,并且只有当 signed_request 访问令牌与你在会话中保存的不同时才刷新它(使用图形 API)。

将 _top 添加到链接目标的行为是可以的,并且在 facebook 画布中是一种很好的做法。

【讨论】:

嗨,barbolo,我只是在用户第一次进入我的画布时才询问图表(目前的基本用户信息,将来会改变,我会要求更多的东西) 我正在使用一个应用程序,将我从所有这些事情中抽象出来。主要问题是,当我放 target=_top 时,所有 facebook 都会重新加载,这需要时间。我的应用程序中有很多链接(很多),但是如果我使用普通链接,它会非常快(我仍然可以访问 cookie 中的 signed_request 和用户信息) target=_top 是强制性的吗?如果我只在主画布访问中处理 POST signed_request,是否存在任何安全问题? 好的,现在更清楚了。你看到的行为是完全正常的。您可以检查其他几个以完全相同的方式工作的应用程序(例如,Payvment 的 Shopping Mall 测试)。不使用 target=_top 的主要问题是用户将无法使用浏览器后退按钮或复制当前导航 url。如果这对您来说不是问题,那么您可以避免使用 target=_top 嗨,巴博罗!感谢您的回答。嗯...在速度方面的好处比后退按钮 + url 大得多,所以我将使用内部 iframe 引用。再次感谢!

以上是关于单击链接时缓慢加载 Facebook 画布应用程序(如果目标顶部)的主要内容,如果未能解决你的问题,请参考以下文章

facebook允许访问对话框

有没有办法 pushState() facebook 画布中的父窗口?

单击表格视图单元格时加载缓慢

单击按钮时如何清除画布[重复]

在 Facebook 集成中,当我单击登录按钮时,它会显示加载并返回主屏幕?

接受来自 phonegap 应用程序的应用程序请求(无画布)