根据Facebook API文档,大部分工作都是通过javascript处理的。
这意味着所有处理都已完成,然后前端检查用户是否连接到Facebook /授权。正确?
我的问题是:
假设用户第一次访问我的网站。 他点击“facebook connect”。 javascript将其验证为可信,并将其“重定向”到我服务器上的另一个页面。从那时起,我怎么知道用户实际上已经对我的网站进行了身份验证,因为一切都是在前端完成的?
我认为这是正确的,但是没有一些安全问题..:
- 用户点击登录后,Facebook会重定向到我网站上的某个页面。并且他们还创建了一个具有特定“Facebook ID”的cookie,该ID仅从该用户检索。我的后备人员将“读取”cookie并获取该ID ...然后将其与我的userID相关联。
如果这是正确的......那么它没有意义。如果人们窃取其他人的“Facebook ID”然后伪造cookie怎么办?然后我的后端看到cookie并认为它是真正的用户......?
我感到困惑吗?如果我感到困惑,请帮我重组并告诉我它是怎么回事。
答案 0 :(得分:6)
Facebook Connect使用聪明(或疯狂,取决于您的观点)黑客来实现您的网站与Facebook的身份验证系统之间的跨站点通信。
它的工作方式如下:
xd_receiver.htm
,但可以按照您喜欢的名称命名。iframe
,其中加载了跨域通信文件。src
的{{1}}元素,这用于与页面上托管的跨域通信文件进行通信。iframe
中插入另一个嵌套iframe
来实现Facebook方向的任何进一步沟通 - 这个第二级iframe
存在于Facebook的服务器而不是你的服务器上。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?