Facebook文档指出
应用程序秘密或应用程序访问令牌不应包含在的开发人员以外的任何人都可以访问的代码应用程序。这适用于所有不安全的代码方法,如客户端代码(如HTML或Javascript)或本地应用程序(如iOS、Android或Windows桌面应用程序)。https://developers.facebook.com/docs/facebook-login/security#appsecret
因此,如果您在应用程序中的"高级设置"下的"应用程序类型"Dashboard设置为Native/Desktop,我们假设您的本机应用程序在二进制文件中包含应用程序秘密或应用程序访问令牌,并且我们不允许使用应用访问令牌签名的呼叫继续进行。API将表现得好像没有提供访问令牌一样。
因此,如果你在应用程序中嵌入App Secret并告诉Facebook,它将停止使用OAuth(我也测试过,当你选中该选项时,Facebook将停止验证该秘密)。
但是Xamarin.Auth 1.3(最新稳定版)需要clientSecret(在OAuth2Authenticator类中,clientSecret是必需的参数),并在用户成功登录时使用它来获取Facebook访问令牌。
那么,这是一个bug,有没有变通方法,或者Xamarin。Auth目前对Facebook毫无用处?
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
我们不要混淆事情。这与Xamarin.A.A.无关
OAuth2有两个主要选项:
- 隐含流
- 授权代码流
隐式流不需要客户端机密。隐式流通常用于移动应用程序,因为它们不能保守秘密(你可以分解应用程序二进制文件并找到秘密)。Javascript或桌面应用程序也是如此。保护秘密的唯一方法是将其存储在第三方(即用户)无法访问的服务器上。
授权代码流使用客户端机密作为额外的保护,该机密标识特定的一方,如服务器。
那么脸书是怎么说的呢?他们说,如果你在Facebook的仪表板中将你的应用程序配置为本地/桌面应用程序,他们会假设(!)你将秘密存储在二进制文件中,因为:它还会去哪里?因此,这个秘密不再是真正的秘密,因此Facebook API的行为就好像这个秘密不存在一样。
两种解决方案:
- 要么你将你的应用程序配置为,而不是本地/桌面(我不知道Facebook使用哪个术语,可能是"服务器")
- 或者使用为移动客户端设计的隐式流
回答你最初的问题:是的,Xamarin.Auth支持Facebook的OAuth2,因为它和其他OAuth2一样。