Facebook如何验证Facebook Connect请求?

时间:2012-08-28 02:09:21

标签: javascript facebook api sdk connect

所以我正在为我的网站开发自己的API - 我正在模仿关于我的系统如何工作的Facebook JS SDK。 API客户端显示一个按钮,弹出窗口,用户可以登录。登录弹出窗口向开启窗口发出一个事件,父窗口现在知道用户已登录。这一切都有效。

我无法理解的是他们如何验证刷新请求是否有效。如果API客户端需要向服务器发送请求以询问用户是否已登录并且所有内容都在JS中,那么一切都是透明的。 API客户端说,“嗨,我是应用程序4jhkk2l3bnm389,登录Facebook的用户是否也通过身份验证?如果是这样,你能给我发送一个新令牌,以便我可以进行API调用吗?”和Facebook说,“哦,你是申请4jhkk2l3bnm389?是的,用户登录并允许你访问他们的信息,这是一个访问令牌。”

但Facebook如何阻止不是真正应用程序的外部应用程序说“嘿,我是实际应用程序4jhkk2l3bnm389,我保证我不会说谎。我可以拥有一个访问令牌?“

我不知道他们如何确定差异。显然,如果它都是通过现代浏览器中的AJAX调用完成的,那么您只需提供一个Access-Control-Allow-Origin标头即可。但如果恶意客户端使用cURL,那么我认为我无法区分它们。 Facebook如何做到这一点?非常感谢一个很好的解释!谢谢!

2 个答案:

答案 0 :(得分:1)

所有访问令牌都属于一个应用/用户对,并且为了让Facebook将这样的访问令牌返回给应用,必须对这些令牌进行验证。

根据redirect_uri中指定的域验证app或client_id - 如果页面尝试使用它不拥有的client_id / redirect_uri对,则它将不会收到访问令牌,因为它将传递给有效的redirect_uri(JS SDK使用的机制遵循相同的规则)。

用户或uid在您登录时使用Facebook设置的Cookie进行验证。

虽然您可以使用curl轻松欺骗client_id / redirect_uri对,但同样不适用于uid,因为您必须拥有用户cookie。如果是这种情况,那么您可以简单地授予您自己的应用程序访问权限。

答案 1 :(得分:0)

Facebook使用OAuth 2.0进行身份验证。您可以在此处找到Facebook如何处理OAuth的详细信息:https://developers.facebook.com/docs/authentication/。 OAuth有多种不同的使用方式,具体取决于您是在移动设备上,还是在facebook.com上的页面,或者在您的情况下,只是facebook.com之外的网页。有关最终流程的详细信息,请访问:https://developers.facebook.com/docs/authentication/client-side/

基本上,Facebook知道您授权查看您的信息的应用程序。当你运行其中一个应用程序时,他们首先确保你登录到Facebook,然后他们从Facebook请求用户访问令牌,基本上说,“嘿Facebook,我不认识这个人,我也不应该。我可以获取他们的信息?“然后Facebook在内部查看,如果它决定此特定应用程序应该可以访问此用户的信息,它会发送用户令牌。

这是描述它的简单方法。验证流程可以通过许多不同的方式发生,这取决于我之前说过请求发生在什么类型的设备上,这是否是facebook.com上的页面等,主要基于您的安全限制。最好阅读前面提到的Facebook身份验证文档,因为它可能会变得非常棘手。