1

Facebook 文档指出

App Secret 或 App Access 令牌不应包含在除应用程序开发人员之外的任何人都可以访问的任何代码中。这适用于所有不受保护的代码方法,例如可以反编译的客户端代码(例如 HTML 或 Javascript)或本机应用程序(例如 iOS、Android 或 Windows 桌面应用程序)。https://developers.facebook.com/docs/facebook-login/security#appsecret

因此,如果您在 App Dashboard 的 Advanced Settings 下的“App Type”设置为 Native/Desktop,我们假设您的原生应用在二进制文件中包含 App Secret 或 App Access Token,并且我们不允许使用签名的调用应用访问令牌以继续。API 的行为就像没有提供访问令牌一样。

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

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

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

4

2 回答 2

1

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

OAuth2 有两个主要选项:

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

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

授权代码流使用客户端密钥作为附加保护,该密钥标识特定方,如服务器。

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

两种解决方案:

  • 要么您将您的应用程序配置为非本机/桌面(我不知道 Facebook 使用哪个术语,也许是“服务器”)
  • 或者您使用为移动客户端设计的隐式流程。

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

于 2016-08-04T15:55:44.760 回答
1

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

于 2016-08-08T10:53:14.603 回答