【发布时间】:2026-01-21 16:10:01
【问题描述】:
我正在设计一个 JSON Web API,并希望通过唯一的 ID 来区分客户端,以便监控使用情况并阻止恶意/行为不端的客户端。 API 没有封装在 JavaScript 库中,也不是 Web 应用程序独有的,任何客户端类型(桌面、电话等)都可以使用它。
问题是,web 应用(官网)也是 API 本身的客户端,因此必须公开其 API 密钥。因此,某些用户可以直接从页面上的 JavaScript 中提取密钥并使用它,而不是生成自己的密钥。
是否有可能通过一些更好/更智能的设计选择以某种方式缓解这个问题,还是我必须接受这样一个事实,即任何恶意使用 API 的人都可以利用这一点?
我对前端应用程序 (EmberJS) 和后端服务器 (Go) 有 100% 的控制权,因此可以建议任何更改。
- 我正在使用每个会话/IP 的速率限制来为这种情况添加额外的保护层
- twitter.com 页面曾经也是它自己的 API 的客户端。他们是如何解决这个问题的?
注意:问题不在于身份验证或安全性本身,而是如何要求第 3 方用户在身份验证之外(!)使用 API 密钥!
【问题讨论】:
-
这是*.com/questions/2256305/… 的非常接近的副本。里面有一些很好的答案。
-
不幸的是,这并不像我想象的那么容易。那里提供的答案假设该应用程序仅在加载 Google JS 库的浏览器中使用。我的情况并非如此。因此,仍然感谢更具体的答案!
-
不,我不能要求域(分别在 JS 中检查正确的域),因为该 API 不仅适用于网络应用,还适用于桌面客户端、手机等。
-
@ErikAigner 您能否介绍一下 API 的功能。想考虑是否有可能与 API 密钥一起拥有一个秘密密钥。
-
你的官方webapp是否只能直接从JS访问你的API?它是一个要求吗?您能否对其进行重新设计,以便仅从您的服务器端代码访问您的 API?通常,当您想避免未经授权的 API 客户端冒充合法客户端时,您会希望使用某种方法使用 API 密钥对请求进行签名,但这需要您在服务器端进行,否则您需要还可以在您的 JS 代码中公开您的 API 机密。
标签: web-services security api web-applications api-design