我有一个提供API的应用程序,它是OAuth2提供者。
我想使用仅限客户端的应用程序访问此API(读取和写入)。我正在使用JSO使这更容易。
它运行良好。
问题是,我不必在任何地方输入我的客户端密钥(我在我的应用程序中注册的应用程序的密钥)。 我理解为什么这样做,因为它会对任何人都可用。
那么,如果我可以在没有客户端密钥的情况下访问我的API,您能否解释一下其目的是什么?
这个讨论提供了一个很好的解释,说明为什么对于服务器端应用程序而言,客户端密钥比客户端应用程序更加重要。其中一段摘录如下:
Web应用程序[即服务器端应用程序]使用客户端密钥,因为它们代表着巨大的攻击向量。假设有人污染了DNS记录并设置了一个“仿冒”的恶意应用程序,那么相似之处可能不会被注意到数月之久,此期间中间人攻击将吸取大量数据。客户端密钥旨在减轻这种攻击向量。对于单用户客户端,妥协必须逐个设备进行,与其相比非常低效。
在OAuth 1.0中,客户端秘钥(Client Secret)被用于对请求进行签名,因此是必需的。一些OAuth2服务器(例如Google Web Server API)要求发送客户端秘钥以接收访问令牌(可以是请求令牌或刷新令牌)。
OAuth 2.0已经显著减少了客户端秘钥的作用,但对于仍在使用该功能的服务器仍需要将其传递。
这个问题曾经让我发疯,直到我看到一个例子,答案变得显而易见。
在 The Server 返回授权访问我的内容的令牌之前,我必须先登录 The Server。
换句话说,如果我没有与 The Server 的有效登录会话,The Server 将向我这个人呈现登录屏幕。这就是为什么解释总是说“服务器负责认证”的原因。
当然,The Server 不一定要求我已登录。这是现实的吗?Dropbox 是否真的会授予任何人访问我的文件而不需要登录?当然不会。我读过的大多数解释都忽略了这一点,好像这并不重要,但实际上这是唯一重要的事情。