OAuth2中客户端密钥的目的是什么?

37

我有一个提供API的应用程序,它是OAuth2提供者。

我想使用仅限客户端的应用程序访问此API(读取和写入)。我正在使用JSO使这更容易。

它运行良好。

问题是,我不必在任何地方输入我的客户端密钥(我在我的应用程序中注册的应用程序的密钥)。 我理解为什么这样做,因为它会对任何人都可用。

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


3个回答

15

这个讨论提供了一个很好的解释,说明为什么对于服务器端应用程序而言,客户端密钥比客户端应用程序更加重要。其中一段摘录如下:

Web应用程序[即服务器端应用程序]使用客户端密钥,因为它们代表着巨大的攻击向量。假设有人污染了DNS记录并设置了一个“仿冒”的恶意应用程序,那么相似之处可能不会被注意到数月之久,此期间中间人攻击将吸取大量数据。客户端密钥旨在减轻这种攻击向量。对于单用户客户端,妥协必须逐个设备进行,与其相比非常低效。


1
这没有任何意义。客户端密钥有什么好处?黑客可以分解应用程序以获取客户端密钥。在Web服务器应用程序的情况下,它将存储在Javascript Http调用中。 - user1034912

15

在OAuth 1.0中,客户端秘钥(Client Secret)被用于对请求进行签名,因此是必需的。一些OAuth2服务器(例如Google Web Server API)要求发送客户端秘钥以接收访问令牌(可以是请求令牌或刷新令牌)。

OAuth 2.0已经显著减少了客户端秘钥的作用,但对于仍在使用该功能的服务器仍需要将其传递。


2
好的,那么不传递它不会造成安全问题? - Robin
只要你正在与的OAuth服务器不需要它,那就不用担心它。 - Mark S.
事实上,OAuth 服务器是我的,所以我有可能搞砸了 ^^. 但是既然我正在使用 Doorkeeper,它似乎是一个不错的 gem,所以我不会担心。尽管如此,我仍然希望能更好地理解为什么它不再被广泛使用,但仍然存在... - Robin
1
我正在查看RFC http://tools.ietf.org/html/rfc6749,并在文档中搜索单词*客户端密钥*,该单词在文档中出现了3到6次,但都没有解释为什么要使用它。看起来好像不需要传递它? - chischaschos
1
我也对client_secret感到困惑。在这份文档[1]中,他们将其称为随机字符串。它真的只是一个随机字符串吗?我找不到任何关于如何生成client_secret的参考资料。[1] http://oauthbible.com/#oauth-2-two-legged - Luke

-3

这个问题曾经让我发疯,直到我看到一个例子,答案变得显而易见。

在 The Server 返回授权访问我的内容的令牌之前,我必须先登录 The Server。

换句话说,如果我没有与 The Server 的有效登录会话,The Server 将向我这个人呈现登录屏幕。这就是为什么解释总是说“服务器负责认证”的原因。

当然,The Server 不一定要求我已登录。这是现实的吗?Dropbox 是否真的会授予任何人访问我的文件而不需要登录?当然不会。我读过的大多数解释都忽略了这一点,好像这并不重要,但实际上这是唯一重要的事情。


3
我认为你混淆了client_secret和auth code。后者在用户授权之后(不管怎样实现)返回。然后用它来请求access_token。 - AaronHS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接