没有Xamarin.Auth 1.3可以安全地使用Facebook OAuth吗?

时间:2016-08-04 14:23:07

标签: facebook xamarin facebook-oauth xamarin.auth

Facebook文档声明

  

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

     

出于这个原因,如果你的应用类型'在应用程序的高级设置下   仪表板设置为Native / Desktop我们假设您的原生应用程序   包含二进制文件中的App Secret或App Access Token,我们   不允许使用App Access Token签名的呼叫继续。 API   将表现得好像没有提供访问令牌。

因此,如果您在应用程序中嵌入App Secret并告诉Facebook有关它,它将停止使用OAuth(我也测试了这一点,当您检查该选项时,Facebook会停止验证该秘密)。

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

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

2 个答案:

答案 0 :(得分:1)

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

OAuth2有两个主要选项:

  1. 隐含流量
  2. 授权代码流程
  3. 隐式流程需要客户端密钥。隐式流程通常与移动应用程序一起使用,因为它们无法保密(您可以反汇编应用程序二进制文件并找到秘密)。与Javascript或桌面应用程序相同。保护秘密的唯一方法是将其存储在第三方(=用户)无法访问的服务器上。

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

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

    两种解决方案:

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

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

答案 1 :(得分:1)

OAuth2Authenticator包含多个构造函数,其中一个不需要ClientSecret

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

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

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