Xamarin.Auth 1.3 不能安全地与 Facebook OAuth 一起工作吗?

Doesn't Xamarin.Auth 1.3 work securely with Facebook OAuth?

Facebook 文档指出

the App Secret or an App Access token should never be included in any code that could be accessed by anyone other than a developer of the app. This applies to all methods of code that are not secured like client-side code (such as HTML or Javascript) or native apps (such as iOS, Android or Windows desktop apps) that could be decompiled. https://developers.facebook.com/docs/facebook-login/security#appsecret

For this reason, if your 'App Type' under Advanced Settings in the App Dashboard is set to Native/Desktop we assume that your native app contains the App Secret or an App Access Token in the binary, and we do not allow calls signed with an App Access Token to proceed. The API will behave as though no access token was provided.

因此,如果您将 App Secret 嵌入您的应用程序并告知 Facebook,它将停止使用 OAuth(我也对此进行了测试,当您选中该选项时,Facebook 将停止验证该秘密)。

但Xamarin.Auth1.3(最新稳定版)需要clientSecret(在OAuth2Authenticator中classclientSecret是必需的参数)并在用户成功登录时使用它来获取Facebook访问令牌。

这是一个错误,是否有解决方法,或者 Xamarin.Auth 目前对 Facebook 没有用?

让我们不要混淆事情。这与Xamarin.Auth无关。

OAuth2 有两个主要选项:

  1. 隐式流
  2. 授权码流程

隐式流程不需要客户端密码。隐式流通常用于移动应用程序,因为它们无法保密(您可以反汇编应用程序二进制文件并找到秘密)。 Javascript 或桌面应用程序也是如此。保护秘密的唯一方法是将其存储在第三方(=用户)无法访问的服务器上。

授权代码流使用客户端机密作为 additional protection,该机密标识特定方,如服务器。

那么 Facebook 声明了什么?他们说,如果您将您的应用程序配置为 Facebook 仪表板中的 native/desktop 应用程序,他们会假设(!)您将秘密存储在二进制文件中,因为:它还会去哪里?因此,秘密不再是真正的秘密,因此 Facebook API 就好像秘密不存在一样。

两种解决方案:

  • 要么你把你的应用配置成不是native/desktop(我不知道Facebook用的是哪个词,可能是"Server")
  • 或者您使用专为移动客户端设计的隐式流程。

然后回答您最初的问题:是的,Xamarin.Auth 支持 Facebook 的 OAuth2,因为它与任何其他 OAuth2 一样。

OAuth2Authenticator 包含多个构造函数,有一个不需要 ClientSecret:

public OAuth2Authenticator (string clientId, string scope, Uri authorizeUrl, Uri redirectUrl, GetUsernameAsyncFunc getUsernameAsync = null)

这个将允许 OAuth2 隐式流程,因此不需要将客户端密码存储在您的应用程序代码中。

参考:https://github.com/xamarin/Xamarin.Auth/blob/9c19d90e52994188def9e12e0bbc981a3943a752/src/Xamarin.Auth/OAuth2Authenticator.cs#L110