1

所以我正在为我的网站开发我自己的 API——我在模仿 Facebook JS SDK 来了解我的系统是如何工作的。API客户端显示一个按钮,弹出窗口,用户可以登录。登录弹出窗口向打开窗口发出一个事件,父窗口现在知道用户已登录。一切正常。

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

但是 Facebook 如何防止不是真实应用程序的外部应用程序说:“嘿,实际上是应用程序 4jhkk2l3bnm389,我保证我没有撒谎。我可以有一个访问令牌吗?”

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

4

2 回答 2

1

所有访问令牌都属于应用程序/用户对,为了让 Facebook 将此类访问令牌返回给应用程序,必须验证这些访问令牌。

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

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

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

于 2012-08-28T07:09:56.823 回答
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 身份验证文档以获取详细信息,因为它可能会变得非常棘手。

于 2012-08-28T02:31:49.667 回答