我正在使用 before_filter 来检测signed_request
Facebook 在用户被引用到画布应用程序时生成的查询字符串。
然后,session[:canvas] = true
当我需要不同的应用程序逻辑时,我会根据用户是在画布中还是在本机浏览器应用程序上进行设置和测试。问题是,如果用户出于任何原因离开画布并导航到基于浏览器的应用程序,该session[:canvas]
变量仍然设置为 true。
有没有更好的方法来检测画布和本机浏览器应用程序之间的差异?
我正在使用 before_filter 来检测signed_request
Facebook 在用户被引用到画布应用程序时生成的查询字符串。
然后,session[:canvas] = true
当我需要不同的应用程序逻辑时,我会根据用户是在画布中还是在本机浏览器应用程序上进行设置和测试。问题是,如果用户出于任何原因离开画布并导航到基于浏览器的应用程序,该session[:canvas]
变量仍然设置为 true。
有没有更好的方法来检测画布和本机浏览器应用程序之间的差异?
我个人喜欢为 Facebook 应用程序使用“别名”url,例如在应用程序设置中使用fb.mysite.com
而不是,www.mysite.com
并进行设置以使两个域指向同一个地方。或者可以对目录进行类似的操作,例如www.mysite.com/fb/
指向相同的位置,www.mysite.com/
但为代码提供了一种简单的方法来确定它是直接访问还是来自应用程序。
使用会话也可以工作,但如果您当前处于“应用程序模式”(canvas==true),则必须添加额外的 javascript 检查。javascript 只是检查页面是否在 iframe 内,如果不是,则重定向到类似www.mysite.com/thispage?app=0
. 您的页面应检查app=0
参数并清除会话(如果存在)(或设置 canvas=false)。这样,如果用户从 Facebook 内部开始,然后直接访问您的网站,事情就会自动得到正确调整。
不要在会话中存储此信息,而是检查是否存在 signed_request 参数,如果没有参数,则可能意味着用户不再在 facebook 应用程序内。
我可能完全错了,但 Facebook 不是通过 POST 而不是 GET 请求访问您的画布内容吗?这不是区分请求来自哪里的最简单方法吗?