客户端秘密在OAuth 2.0中

要使用谷歌驱动器的API,我必须玩OAuth2.0authentication。 我对此有了一些疑问。

  1. 客户端ID和客户端密钥用于识别我的应用程序。 但是,如果它是一个客户端应用程序,它们必须被硬编码。 所以,每个人都可以反编译我的应用程序,并从源代码中提取它们。 这是否意味着一个不好的应用程序可以假装使用良好的应用程序的客户端ID和秘密是一个很好的应用程序? 所以用户会显示一个屏幕,要求授予一个好的应用程序的权限,即使它实际上是由一个不好的应用程序所要求的? 如果是,我该怎么办? 或者其实我不应该担心这个?

  2. 在移动应用程序中,我们可以将webviewembedded到我们的应用程序中。 而且很容易在webview中提取密码字段,因为请求权限的应用程序实际上是一个“浏览器”。 那么,移动应用程序中的OAuth没有客户端应用程序无法访问服务提供者的用户凭据的好处?

我开始写你的问题的评论,但后来发现有太多的话要说,所以这里是我对这个问题的看法在答案。

  1. 是的,这是真实的可能性,并有一些基于此的利用。 build议不要在应用程序中保留应用程序的秘密,甚至有一部分规范中的分布式应用程序不应该使用此标记。 现在你可能会问,但是XYZ需要它来工作。 在这种情况下,他们没有正确地实现规范,你应该不使用该服务(不太可能),或者B尝试使用一些混淆方法来保护令牌,以便更难find或使用服务器作为代理。

    例如,Android的Facebook库中存在一些漏洞,这些漏洞是由Logs泄漏的,您可以在这里了解更多信息http://attack-secure.com/all-your-facebook-access-tokens-are-belong对我们和这里https://www.youtube.com/watch?v=twyL7Uxe6sk 。 总而言之,要对第三方库的使用格外谨慎(实际上是常识,但是如果令牌劫持是你最担心的事情,那就多加小心)。

  2. 我一直在争论点2。 我甚至在我的应用程序中做了一些解决方法,以修改同意页面(例如更改缩放和devise以适应应用程序),但是没有任何东西阻止我通过用户名和密码从web视图内的字段读取值。 因此,我完全同意你的第二点,并发现它在OAuth规范中是一个很大的“bug”。 点是“应用程序无法访问用户凭据”规范只是一个梦想,给用户的安全感错误…另外我猜人们通常怀疑当应用程序要求他们的脸书,推特,Dropbox或其他凭据。 我怀疑许多普通人阅读OAuth规范,并说“现在我安全”,而是使用常识,一般不使用他们不信任的应用程序。

我在这里和问题1有同样的问题,最近也做了一些研究,我的结论是不要把“客户机密”保密。 不保密客户机密的客户端types在OAuth2规范中称为“公共客户端”。 以下事实阻止了某人恶意获取授权码,然后访问令牌的可能性。

1.客户需要直接从用户获取授权码,而不是从服务中获得

即使用户指出他/她信任客户端的服务,客户端也不能通过显示客户端ID和客户端密钥从服务获得授权代码。 相反,客户端必须直接从用户那里获得授权码。 (这通常是通过URLredirect完成的,稍后我将会讨论)。因此,对于恶意客户端来说,仅仅知道用户信任的客户端ID /秘密是不够的。 它必须以某种方式涉及或欺骗用户给它的授权码,这应该比只知道客户端ID /秘密更难。

2.redirectURL以客户端ID /密码注册

让我们假设恶意客户端设法让用户参与,并让他/她点击服务页面上的“授权应用程序”button。 这将触发从服务到用户浏览器的URLredirect响应,并带有授权码。 然后,授权码会从用户的浏览器发送到redirectURL,客户端应该在redirectURL上收听授权码。 (redirectURL也可以是本地主机,我认为这是一个“公共客户”接收授权代码的典型方式)。由于这个redirectURL是在客户端ID /秘密的服务上注册的,恶意客户没有有一个方法来控制授权代码的位置。 这意味着恶意客户端与您的客户端ID /秘密有另一个障碍获得用户的授权码。

回答第二个问题:Google API出于安全原因要求authentication/login不能在App本身内完成(比如不允许webview),并且需要使用浏览器在应用程序之外完成,以获得更好的安全性,这将在下面进一步解释: https: //developers.googleblog.com/2016/08/modernizing-oauth-interactions-in-native-apps.html