根据Facebook API文档,大部分工作都是通过javascript处理的.
这意味着所有处理都已完成,然后前端检查用户是否连接到Facebook /授权.对?
我的问题是:
假设用户第一次访问我的网站.他点击"facebook connect".javascript将其验证为可信,并将其"重定向"到我服务器上的另一个页面.从那时起,我怎么知道用户实际上已经对我的网站进行了身份验证,因为一切都是在前端完成的?
我认为这是正确的,但是没有一些安全问题..:
- 用户点击登录后,Facebook会重定向到我网站上的页面.并且他们还创建了一个具有特定"Facebook ID"的cookie,该ID仅从该用户检索.我的后备人员将"读取"cookie并获取该ID ...然后将其与我的userID相关联.
如果这是正确的......那么它没有意义.如果人们窃取其他人的"Facebook ID"然后伪造cookie怎么办?然后我的后端看到cookie并认为它是真正的用户......?
我很困惑吗?如果我感到困惑,请帮我重组并告诉我它是怎么回事.
Facebook Connect使用聪明(或疯狂,取决于您的观点)黑客来实现您的网站与Facebook的身份验证系统之间的跨站点通信.
它的工作方式如下:
您的站点包含一个非常简单的静态HTML文件,称为跨域通信通道.此文件xd_receiver.htm
在FB文档中调用,但它可以命名为您喜欢的任何名称.
您网站的登录页面包含对Facebook服务器上托管的Javascript库的引用.
当用户通过"连接"按钮登录时,它会调用Facebook的JS API中的一个功能,弹出一个登录对话框.此登录框具有不可见iframe
,其中加载了跨域通信文件.
用户填写表单并提交表单,将表单发布到Facebook.
Facebook检查登录.如果成功,它会将此信息传达给您的网站.这是跨域内容的来源:
由于跨域安全策略,Facebook的登录窗口无法检查服务器上托管的文档的DOM树.但是登录窗口可以更新其中src
的任何元素iframe
,这用于与页面上托管的跨域通信文件进行通信.
当跨域通信文件收到指示登录成功的通信时,它使用Javascript设置一些包含用户ID和会话的cookie.由于此文件存在于您的服务器上,因此这些cookie具有您的域名,您的后端可以接收它们.
Facebook方向上的任何进一步沟通都可以通过插入另一个嵌套iframe
在另一个中来实现iframe
- 这个二级iframe
生活在Facebook的服务器而不是你的服务器上.
Cookie是安全的(理论上),因为数据是使用Facebook在您注册开发人员计划时为您生成的密钥签名的.JS库使用您的公钥("API密钥")来验证cookie.
从理论上讲,Facebook的Javascript库会在您完成所有操作后自动处理这一切.在实践中,我发现它并不总是完全顺利.
有关使用iframe
s 的跨域通信机制的更详细说明,请参阅MSDN中的这篇文章.