2012-08-28 66 views
1

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

我难以理解的是他们如何验证刷新请求是否有效。如果API客户端需要向服务器发送请求以询问用户是否已登录并且全部使用JS,那么一切都是透明的。 API客户端说:“嗨,我是应用程序4jhkk2l3bnm389,是在Facebook上登录的用户,并且已通过身份验证?如果是这样,您可以向我发送新令牌,以便我可以调用API调用吗?” Facebook说:“哦,你是应用程序4jhkk2l3bnm389?是的,用户已经登录并允许你访问他们的信息,这里是一个访问令牌。”

但如何防止Facebook的外部应用程序不是可信的应用程序从说:“嘿,I'M实际应用4jhkk2l3bnm389,我发誓我没有说谎,我能有一个访问令牌?”

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

回答

1

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

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

用户,或UID,在使用cookie的Facebook当您登录设置验证。

虽然你可以使用curl容易欺骗CLIENT_ID/REDIRECT_URI对,同样不适用于UID,如您必须拥有用户的cookie。如果是这种情况,那么你可以简单地授予你自己的应用程序访问权限。

+0

非常感谢你。所以我想最好的方法是让API客户端在他们的服务器上设置一个“刷新cookie”,以某种方式表示用户。当用户重新加载页面时,客户端会检查该cookie是否存在。如果确实如此,它会重定向到auth网关,然后使用标记重定向到回调页面(前提是刷新cookie是正确的。)对我有意义!非常感谢。 – lwansbrough

+0

其实通过这个逻辑,我可以通过AJAX做到这一点,然后我不能吗?当用户授权客户端时保存刷新cookie,在每次页面加载时调用它,并在每次加载页面时更改它。 – lwansbrough

+0

@iLoch通过AJAX做什么? XMLHttpRequest与浏览器的其他部分采用相同的同源策略,CORS未启用此类端点。 –

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身份验证文档,因为它可能会非常棘手。

+0

我会看看这些链接,但我有点觉得你错过了我的问题 - 也许我没有足够的措辞。最基本的问题是,Facebook如何防止脚本欺骗应用程序ID,如果他们不需要客户端密钥通过JS API进行身份验证? – lwansbrough