【问题标题】:How to allow access to API only for own pages?如何只允许自己的页面访问 API?
【发布时间】:2016-12-01 19:01:56
【问题描述】:

我正在开发提供 REST API 的 Spring Boot Web 应用程序。我的大部分页面(thymeleaf 模板)都使用这个 API 与后端通信(使用 AJAX 请求)。我已经阅读了不同的方法,例如基本身份验证、OAuth2 等。这些方法描述了用户身份验证,之后用户可以访问 API。但我不希望用户使用浏览器或 REST 客户端直接与我的 API 通信(即 postman chrome 扩展,它可以访问浏览器的 cookie,访问令牌通常存储在其中)。

我有这样的事情:
(1) 用户 --> (2) MyOwnPages --> (3) RestAPI。

有没有办法防止直接沟通 1-3 ?
我能否以某种方式确定该请求是从我的页面发出的(即向每个请求添加某种访问令牌)?有什么最佳做法吗?

谢谢!

【问题讨论】:

  • 这就是 DMZ 的用途 (en.wikipedia.org/wiki/DMZ_(computing))。在您的情况下,您需要两个中间有防火墙的应用程序:一个在 DMZ 中充当中介,一个在您的后端。

标签: api rest spring-security spring-boot rest-security


【解决方案1】:

不,这完全不可能。您可以添加令牌以使其更难,在 Javascript 中生成内容等等,但所有这些都会让您的页面变慢并且更有可能崩溃。

流程不是:

(1) User --> (2) MyOwnPages --> (3) RestAPI.

而是:

(1) User --> (2) Users Browser --> (3) RestAPI.

由于调用 API 的是浏览器,因此没有明智的方法来区分 cURL、Postman 等之间的区别。您可以做的任何事情,用户都可以将 Wireshark 放入准确查看正在发送的内容的方法,并据此可以执行浏览器正在执行的任何操作。

确切地了解您为什么要这样做会更有帮助,因为无论您的最终目标是什么,都可能有更好的解决方案。

【讨论】:

  • 感谢您的回复!我的目标是防止用户做坏事。假设,我有下一个端点:POST ../api/checks。付款成功后,前端用于创建支票的此端点。我不希望用户使用一些休息客户端手动创建检查。或者我应该只是删除这些端点并将这个逻辑封装在我的其他端点中(只是防止使用单独的端点创建支票,而不是自动创建支票,即付款成功后)?
猜你喜欢
  • 2011-07-31
  • 1970-01-01
  • 2013-06-02
  • 2011-01-02
  • 2014-08-11
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多