情况:我正在开发一个Facebook画布应用程序。每次呈现页面时,Facebook都会向我的服务器发送带有signed_request的POST请求。在我的应用程序内部,我有所有与target =“_ top”的链接,因为如果我不这样做,facebook会在没有签名请求的情况下向我的服务器发送一个共同的GET。所以我无法检查用户信息。
问题:太慢了!即使我在本地测试它,我按下的每次点击需要1秒才能渲染,我的画布变成全白,然后显示信息,这将是一个糟糕的用户体验。
我的测试:如果我删除了target = _top并且在没有app.facebook.com/whatever的情况下将所有链接的href指向我的服务器,则加载非常快。
我的疑惑:这有什么安全问题吗?如果我将所有链接指向我的服务器(没有apps.facebook.com)我无法检查已签名的请求,我只会在主页面中检查它。
有什么建议吗?任何教程?我有什么不妥之处吗? (这是我的第一个facebook应用程序)
答案 0 :(得分:2)
您是否阅读过Server-Side Authentication教程? 你做错了。
一旦用户登陆您的应用程序,您应该将所有链接保留在同一帧中,将整个窗口与facebook一起加载是完全多余的。
你应该做什么:
当你使用签名请求获得POST时,解码它并检查用户是否经过身份验证,是否在某处(会话,数据库,缓存)持有数据(令牌等)。 如果他没有经过身份验证,请按照教程中的说明将他发送到auth对话框,当他回来交换你获得的代码(在GET中)以获得令牌(也在教程中显示),然后将他重定向到http(s): //apps.facebook.com/YOUR_APP,您将通过经过身份验证的签名请求发布,保存,等等。
由于您持久保存数据,因此在每个非POST请求或不包含signed_request的请求中都会检查数据的持久性选择,并使用它。
只有两次facebook会向你发送请求,一旦你的画布加载后是POST,第二次是用户从验证对话框返回时,你要么得到代码用户拒绝身份验证时的参数或错误。 其他请求应该是从您的应用程序(在iframe内)到应用服务器。
答案 1 :(得分:1)
JDL,
我相信您在每次请求时都在查询图API(这就是您总是需要signed_request的原因)。这是对的吗?
图形API非常慢(约1秒/查询),您应该只在必要时使用。例如,当您第一次收到access_token时,您应该将其保存在会话中并查询图API以检索相应的Facebook用户信息。但是,当您的signed_request访问令牌与您在会话中保存的令牌不同时,您应该在会话中提供有关此用户的信息并仅刷新它(使用图API)。
将_top添加到链接目标的行为是可以的,这是Facebook画布中的一个好习惯。