Spring boot REST API 仅接受来自 Angular 前端的调用

Posted

技术标签:

【中文标题】Spring boot REST API 仅接受来自 Angular 前端的调用【英文标题】:Spring boot REST API to accept call only from Angular Front End 【发布时间】:2021-09-13 05:11:43 【问题描述】:

我是 Spring boot rest api 的新手。

我有以下场景:

    KeyCloak 已安装并配置为进行身份验证 Spring Boot 微服务 角前端

Angular 通过 Spring Cloud 网关调用微服务。

我设计了自己的登录页面,该页面使用 KeyCloak 进行身份验证并获取令牌。效果很好。

有没有什么方法可以让未注册用户使用通用令牌仅从 Angular 调用微服务?

为什么我想要这个,是为了保护微服务不被任何其他工具(如邮递员)直接访问。

任何指南/提示将不胜感激。

非常感谢

【问题讨论】:

【参考方案1】:

使用 curl、POSTMAN、httpie 等工具可以轻松地通过浏览器从 Angular 应用程序调用后端微服务。我们无法阻止。

即使您认为在不为未注册用户提供凭据的情况下获取令牌,并且使用该令牌对特定 API 的后台微服务进行有角度的调用,也可以解决该问题。任何人都可以很容易地以未注册用户的身份从浏览器获取令牌,并使用该令牌从 POSTMAN、curl 等工具进行调用。所以我们无法停止来自这些工具的调用

您所能做的就是通过使用 CORS、API-Throttling 来缓解攻击

【讨论】:

【参考方案2】:

我希望您想授予未注册用户访问某些页面的权限。假设任何用户即使没有注册也可以访问登录页面和登录端点。对于这种情况,我们通常不需要任何令牌机制,而是可以有一个IP限制机制,如果用户在X分钟内访问N次网页,则阻止该IP Y分钟。这通常是为了防止 ddos​​ 攻击。

没有办法完全阻止来自 POSTMAN 的访问,因为任何浏览器请求都可以通过添加某些标头或其他参数被 POSTMAN 模拟,即使您为未注册用户设置了一些令牌。

【讨论】:

假设一个未注册的用户正在浏览网站,并查看产品列表。因此,产品列表是通过调用微服务来获取的。那么有什么方法可以直接从 KeyCloak 获取令牌而无需登录,并且当调用完成时,令牌会在标头中传递给微服务。因此,从某种意义上说,我们确保他们的调用是从角度本身进行的。也许在这里我错了,但如果可以实现,需要一些澄清。非常感谢 是的,你是对的,但并非所有 api 都需要事先进行登录/令牌身份验证。看看 Amazon/Flipkart 的搜索 api,您可以在网络选项卡上检查 Flipkart 的搜索端点,这些 api 不需要身份验证令牌。因为它们是公开可用的。在购买商品时,您可以登录,而不是搜索。您应该排除这些 api 使用令牌进行身份验证 为避免过度使用,您可以添加 IP 限制/cors 策略..etc 感谢贾斯汀,据我所知,可以实施 cors 策略来限制通过网络浏览器访问 API。但是,API 仍然可以通过其他方式访问,例如其他人的 POstman。 只要浏览器可以访问调用这个 api 的,POSTMAN 可以调用而不管你设置的每个限制。如果有一种方法可以检测到调用来自特定应用程序,那么它是可能的,但是对于邮递员,我们无法确保它会向我们发送一些属性或标头来区分。因为它是第三方工具,而且它是一个开发工具,我们现在无法在服务器端识别它并阻止它。我认为它也不是 POSTMAN 方面的必需实现。

以上是关于Spring boot REST API 仅接受来自 Angular 前端的调用的主要内容,如果未能解决你的问题,请参考以下文章

java 使用Rest Assured和Spring Boot来休息Api文档

Spring Boot 2 Rest Api Example

使用 Spring Boot 和 JWT 保护 REST Api

无法让spring boot hibernate rest api返回一对多关系

为 Spring Boot REST API 后端构建 Web 前端?

Spring Boot REST API 自动化测试