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