【问题标题】:Doesn't Xamarin.Auth 1.3 work securely with Facebook OAuth?Xamarin.Auth 1.3 不能与 Facebook OAuth 安全地工作吗?
【发布时间】:2016-08-08 18:53:14
【问题描述】:

Facebook 文档指出

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

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

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

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

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

【问题讨论】:

  • 我使用基于非ClientSecret 的构造函数为您添加了一个单独的答案...很高兴您可以正常工作 ;-)

标签: facebook xamarin facebook-oauth xamarin.auth


【解决方案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

【讨论】:

    【解决方案2】:

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

    OAuth2 有两个主要选项:

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

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

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

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

    两种解决方案:

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

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

    【讨论】:

    • 谢谢,但我在问为什么 Xamarin.Auth 要求您将客户端密码嵌入应用程序,以及它如何安全并保持您的应用程序正常工作(如果您在 Facebook 中将应用程序配置为本机,Xamarin.Auth 使用的 Oauth 流将停止工作,秘密验证将失败),如果您不这样做,您的秘密将被泄露(因为它将是二进制文件,用户可以反汇编等)请您说点什么如果你知道答案的话,关于这个……
    • 不能。如果您在移动应用程序中包含客户端机密,则它既不受保护也不是机密。然而,没有人阻止你这样做。对于 implicit 流,您不需要客户端密码。 Facebook 不会检测您的应用程序是否包含客户端密码。他们检查:应用程序是否配置为原生/桌面/移动应用程序?如果是,它是否尝试使用客户端秘密?如果是,请不要接受,因为它不被视为秘密。
    • @Bob 我认为有些混乱可能是您使用了错误的构造函数,使用没有 必需 ClientSecret: public OAuth2Authenticator (string clientId, string scope, Uri authorizeUrl, Uri redirectUrl, GetUsernameAsyncFunc getUsernameAsync = null) :github.com/xamarin/Xamarin.Auth/blob/… 的构造函数
    • 我也有同样的问题。 Xamarin.Auth 1.3 目前没有没有 clientSecret 的构造函数。对于 Xamarin.Auth 1.3,您需要查看便携式诱饵和切换分支。大师已经过时了。
    • @SushiHangover 你是对的,有 2 个构造函数,隐式流确实适用于我没有使用的那个,如果你发布答案,我会接受,tnx
    猜你喜欢
    • 2013-06-13
    • 2011-04-04
    • 2015-12-11
    • 2011-08-24
    • 2020-09-02
    • 2014-12-13
    • 2017-06-10
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多