如果您从不发送客户端密码来获取访问令牌,那么仅本地客户端 Facebook 登录如何安全?

How is native client only Facebook Login secure if you never send your client secret to get an access token?

当您将 Facebook 登录集成到您的应用程序中时,基本上有 2 种(好的,不止 2 种,但对于这个问题我只关心这 2 种)获取访问令牌的方法:

  1. 将 FB return 代码添加到您的应用程序,然后您可以通过添加您的客户端密码在您的服务器上交换访问令牌。客户端发出这样的调用 https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=code ,然后处理重定向 URI 的服务器将代码和客户端密码传递到 FB 以获取访问令牌。
  2. 在重定向 URL: https://www.facebook.com/dialog/oauth?client_id=APP_ID&redirect_uri=REDIRECT_URI&response_type=token 中让 FB return 直接访问您的应用程序的身份验证令牌。在这种情况下,令牌在 URL 片段中直接 returned 到客户端。

(以上信息取自https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/v2.2

因此,我的问题是第二种方法,即 FB return 直接使用令牌,当您无需证明客户是他所说的那个人时,如何保证安全?第二种情况下的令牌 returned 的权限是否比第一种情况少?我在网上知道,默认情况下,客户端的生命周期很短(例如 2 小时令牌),但是如果您使用 Android 或 iOS SDK,即使您从未通过客户端,您也会获得长期生命周期的令牌秘密。因此,相关的问题是 Facebook Android 和 iOS SDK 如何才能真正确定客户端应用程序是它所说的那个人(客户端应用程序总是可以被反汇编并且有人可以窃取您发送的任何信息在应用程序中)?

从根本上说,我试图了解直接向客户端发送令牌的 oauth 流程是如何安全的,而不需要任何类型的服务器端保护机密。

这是一种不太安全的向客户端传输访问令牌的方式。 OAuth 规范在第 10.3 节中明确承认这一点 (https://www.rfc-editor.org/rfc/rfc6749#section-10.3) and more so in section 10.16 (https://www.rfc-editor.org/rfc/rfc6749#section-10.16)。

最后一节的重点是您确实不能相信资源所有者真的给了您访问令牌,因此除了访问令牌允许您访问的信息之外,您绝不能通过客户端公开更多信息.

请注意,向您提供访问令牌的一方显然可以自己掌握该信息,因为它掌握了访问令牌,因此通过您的客户披露该信息没有问题。只是不要假设它是您要公开的资源所有者。

隐式流在 OAuth 规范范围内是安全的 - 委派访问控制,它不能用于验证用户。