Facebook Connect帮助

时间:2009-10-16 21:22:53

标签: javascript python facebook

根据Facebook API文档,大部分工作都是通过javascript处理的。

这意味着所有处理都已完成,然后前端检查用户是否连接到Facebook /授权。正确?

我的问题是:

假设用户第一次访问我的网站。 他点击“facebook connect”。 javascript将其验证为可信,并将其“重定向”到我服务器上的另一个页面。从那时起,我怎么知道用户实际上已经对我的网站进行了身份验证,因为一切都是在前端完成的?

我认为这是正确的,但是没有一些安全问题..:

- 用户点击登录后,Facebook会重定向到我网站上的某个页面。并且他们还创建了一个具有特定“Facebook ID”的cookie,该ID仅从该用户检索。我的后备人员将“读取”cookie并获取该ID ...然后将其与我的userID相关联。

如果这是正确的......那么它没有意义。如果人们窃取其他人的“Facebook ID”然后伪造cookie怎么办?然后我的后端看到cookie并认为它是真正的用户......?

我感到困惑吗?如果我感到困惑,请帮我重组并告诉我它是怎么回事。

3 个答案:

答案 0 :(得分:6)

Facebook Connect使用聪明(或疯狂,取决于您的观点)黑客来实现您的网站与Facebook的身份验证系统之间的跨站点通信。

它的工作方式如下:

  1. 您的网站包含一个非常简单的静态HTML文件,称为跨域通信渠道。此文件在FB文档中称为xd_receiver.htm,但可以按照您喜欢的名称命名。
  2. 您网站的登录页面包含对Facebook服务器上托管的Javascript库的引用。
  3. 当用户通过“连接”按钮登录时,它会调用Facebook的JS API中的一个功能,弹出一个登录对话框。此登录框具有不可见的iframe,其中加载了跨域通信文件。
  4. 用户填写表格并提交表格,将表格发布到Facebook。
  5. Facebook检查登录信息。如果成功,它会将此信息传达给您的网站。这是跨域内容的来源:
    1. 由于跨域安全策略,Facebook的登录窗口无法检查服务器上托管的文档的DOM树。但是登录窗口可以更新其中任何src的{​​{1}}元素,这用于与页面上托管的跨域通信文件进行通信。
    2. 当跨域通信文件收到指示登录成功的通信时,它使用Javascript设置一些包含用户ID和会话的cookie。由于此文件存在于您的服务器上,因此这些Cookie包含您的域名,您的后端可以接收它们。
  6. 可以通过在另一个iframe中插入另一个嵌套iframe来实现Facebook方向的任何进一步沟通 - 这个第二级iframe存在于Facebook的服务器而不是你的服务器上。
  7. Cookie是安全的(理论上),因为数据是使用Facebook在您注册开发人员计划时为您生成的密钥签名的。 JS库使用您的公钥(“API密钥”)来验证cookie。

    理论上,Facebook的Javascript库会在您完成所有操作后自动处理这一切。在实践中,我发现它并不总能顺利运作。

    有关使用iframe进行跨域通信的机制的更详细说明,请参阅MSDN中的this article

答案 1 :(得分:0)

如果我错了,请有人纠正我 - 因为我也试图自己解决所有这些问题。我对cookie的安全性的理解是,还有一个cookie是一个特殊的签名cookie。此cookie是通过组合其他cookie的数据,添加只有您和FB知道的应用程序秘密以及结果MD5-Hashed来创建的。然后,您可以测试此哈希服务器端(黑客无法轻易复制),以确保数据可以信任来自FB。

可以找到更加迷人的解释here - 在页面的中间滚动。

答案 2 :(得分:0)

这里也有同样的问题,我认为斯科特更接近解决方案。

我也在使用“http://developers.facebook.com/docs/?u=facebook.jslib-alpha.FB.init”开源js框架。事情有点不同。

对我来说,通过opensource js框架,facebook在我的网站上提供并设置了一个带有签名的会话。所以我想的是在我身边重新创造这个签名。 - 如果他们都匹配,那么用户就是他说的那个人。

所以基本上如果用户想要保存一些东西到我的数据库,抓住facebook设置的会话签名并用php重新创建该签名并根据facebook给我的那个验证它?

if($_SESSION['facebookSignature'] == reGeneratedSignature){
   // save to database
}else{
  // go away I don't trust you
}

但是如何重新生成该签名?最好不要再拨打Facebook?