我有一个不需要登录的Angular应用。这是一个注册真实世界服务的网站,它需要对任何人开放。作为注册过程的一部分,它需要调用REST api。如果这是一个服务器端应用程序,我会使用一个秘密密钥来保护对REST api的访问。但是因为是Angular,所以它是客户端,有很多方法可以监控网络活动来获取密钥。一旦有人拥有了密钥,他们就可以从任何地方调用REST API(比如Postman)。有没有一种方法可以确保REST api只能从Angular应用程序中调用?我读过关于使用认证服务的文章,该服务接受登录凭据并提供会话令牌(然后可以通过REST API调用传递)。但在我的例子中,用户没有登录。应用程序可以有自己的登录凭据传递给身份验证服务,但是身份验证服务调用将成为弱点,因为应用程序的登录凭据对任何人开放。
简短的回答是——不完全是。
任何前端代码(最终下载并在用户的浏览器中运行)都可以被用户检查。你可以加密秘密,试着混淆你的加密…但是在一天结束时,您调用的方法仍然可以被任何精明的用户读取和使用。
有一个双管齐下的方法来减少的便利性,最终用户可以垃圾邮件你的API:
-
(后端)实现速率限制,IP跟踪,用户代理验证等。任何人都可以欺骗UA,但必须有人想尽办法来改变它。IP限速意味着攻击者在Y分钟内不能访问特定路由超过X次。(此外,根据您的应用程序,某些DNS/CDN提供商可以在他们的终端提供此服务-想想Cloudflare)。
-
(前端)如前所述,通过混淆实现安全性。您可以使用自定义HTTP报头附加到请求中,并使用在前端生成并在后端验证的密钥。很容易被截获和解读,但这是个开始。使用一些自定义散列算法来加密密钥。对于面向公众的端点,最好的办法是在攻击者的路上设置尽可能多的障碍。我看到你提到了一个会话令牌,它绝对可以工作(作为一种速率限制工具)-但是任何使用Postman或类似的人都可以抓取一个并使用它进行攻击(无论你的令牌在什么时间内有效)。