OAuth2 中客户端密码的用途是啥?

Posted

技术标签:

【中文标题】OAuth2 中客户端密码的用途是啥?【英文标题】:What's the purpose of the client secret in OAuth2?OAuth2 中客户端密码的用途是什么? 【发布时间】:2012-08-22 13:07:48 【问题描述】:

我有一个提供 API 的应用。此应用是 OAuth2 提供程序。

我想通过客户端专用应用访问此 API(读取和写入)。我正在使用JSO 来简化此操作。

效果很好。

问题是,我不必在任何地方输入我的客户密码(我在我的应用程序中注册的应用程序)。我明白为什么,任何人都可以使用它。

那么,如果我可以在没有客户端密码的情况下访问我的 api,您能否向我解释一下它的目的是什么?

【问题讨论】:

另见What's the point of the client secret in OAuth2 if it doesn't need to be used? 【参考方案1】:

This discussion 很好地解释了为什么客户端密码对于服务器端应用程序比客户端应用程序更重要。摘录:

Web 应用程序 [服务器端应用程序] 使用客户端机密,因为它们代表着巨大的攻击向量。假设有人毒化了一个 DNS 条目并设置了一个“相似”的流氓应用程序,这种并列可能几个月都不会被注意到,因为这个中介会吸收大量数据。客户端机密应该可以减轻这种攻击向量。对于单用户客户端,必须一次只对一台设备进行妥协,相比之下,这是非常低效的。

【讨论】:

这没有任何意义。客户机密有什么好处?黑客只需分解应用程序即可获取客户端机密。对于 Web 服务器应用程序,它将存储在 javascript Http 调用中。【参考方案2】:

这也让我发疯了,直到我看到一个让答案显而易见的例子。

我必须先登录到服务器,然后服务器才会返回一个令牌,授予对我的资料的访问权限。

换句话说,如果我还没有与服务器的有效登录会话,则服务器将向我(人类)显示登录屏幕。这就是为什么解释总是说“由服务器来验证”之类的。

当然,服务器不必要求我登录。这现实吗? Dropbox 是否真的会将我的文件的访问权限授予未登录的任何人?当然不是。我读过的大多数解释都掩盖了这一点,就好像它无关紧要,实际上它是唯一重要的事情。

【讨论】:

我认为您混淆了 client_secret 和身份验证代码。后者在用户授予权限后返回(但已实现)。然后使用它来请求 access_token。【参考方案3】:

OAuth 1.0 中使用了客户端密钥来签署请求,因此它是必需的。一些 OAuth2 服务器(例如 Google Web Server API)需要发送客户端密码才能接收访问令牌(来自请求令牌或刷新令牌)。

OAuth 2.0 显着减少了客户端密码的作用,但仍会传递给使用它的服务器。

【讨论】:

好的,所以不传递它不是安全问题? 只要你正在与之交谈的 OAuth 服务器不需要它,就不用担心它。 问题是,OAuth 服务器是我的,所以我总是有机会搞砸^^。但由于我正在使用门卫,这似乎是一个很好的宝石,我不会担心它。我仍然想更好地理解为什么它不再被真正使用但仍然存在...... 我正在查看 RFC tools.ietf.org/html/rfc6749 并在文档中搜索了 client secret 这个词,有 3 到 6 个对这个词的引用,但没有一个解释为什么使用它。好像不用过了吧? 我也对 client_secret 感到困惑。在本文档 [1] 中,他们将其称为随机字符串。真的只是一个随机字符串吗?我找不到任何关于如何或生成 client_secret 的参考。 [1]oauthbible.com/#oauth-2-two-legged

以上是关于OAuth2 中客户端密码的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章

博客园OAuth2.0 授权及用户登录

在 Spring Security 中具有密码授权的 oAuth2 客户端

OAuth2.0 - 简化模式密码模式客户端模式讲解

OAuth 客户端凭据重新颁发访问令牌与刷新令牌

当我拥有客户端 ID 和客户端密码时,如何从使用 OAuth2.0 身份验证的 API 获取数据? (亮稿)

Chubby Sequencers 的用途是啥