我们正在开发一种 SaaS 产品,该产品允许企业设置和协调特定类别的商品/服务的销售。该产品的核心有一个 API 和围绕它的各种应用程序的生态系统。其中包括面向公众的网络应用程序(网站)、基于网络的 CMS 和面向销售人员的 iOS 应用程序。我们的客户可以使用这些或构建自己的应用程序来与我们的 API 对话。
我们之间一直在争论如何保护 API。它确实具有身份验证(应用程序的 API 密钥/秘密和用户的用户名/密码)和基于角色/权限的授权。目前,除非请求者对自己进行身份验证,否则无法从 API(除了其版本)获得有用的响应。这包括端点返回可供公众使用的数据,例如待售物品列表。
争论的焦点是 API 是否应该要求对本质上是公共数据的内容进行身份验证。
认证的论据:
- 我们不能只让 API 对任何想调用它的人开放——即使他们无论如何都可以通过利用公共网络应用程序来获取信息。开放的 API 可能被滥用或负载攻击。通过为每个客户端应用程序发布密钥/秘密来更好地控制谁可以访问,这将是第一道防线。
反对认证的论点:
- 无论如何限制对公开提供的内容的访问是没有意义的(通过具有内置“公共”角色的密钥/秘密的面向公众的网络应用程序);
- 要求身份验证不会增加价值,只会通过要求公共应用程序实现身份验证客户端、保留密钥/秘密和刷新身份验证令牌而产生不必要的开销。应用程序应该只在用户需要登录时对 API 进行身份验证(某些客户端根本不需要,因为他们使用访客结帐);
- 任何滥用问题(例如超过请求速率限制、负载攻击等)都应由 DDoS 保护层或内部 API 解决,或两者兼而有之。身份验证不是对此的正确保护,因为恶意客户端可能会获取应用程序凭据并无论如何都会给 API 造成麻烦,更不用说还需要限制身份验证尝试的速率。
如果在严肃的 API 市场上出现上述两个位置中的任何一个,是否存在严重错误或会被嘲笑?这里是否有正确的方法,或者这两种方法在安全性方面是否明智,并且可以根据其他考虑因素(例如方便/易于实施)进行选择?