如何创建只能被前端访问的private api?

How to create private api that can only be accessed by the front-end?

我已经在网上浏览了一段时间,但无法理解仅在前端和后端之间将 API 设为私有的概念。我本质上想要做的是拥有一个只能通过前端访问的 API,不能通过 curl、postman 或其他任何方式访问。

我有以下设置:

  1. 应用托管在 Heroku 上,后端在 nodejs 中

  2. 我使用的是通过 let's encrypt 工具自行生成的 https 连接。

  3. 我有一个 public API atm returns 一个字符串 'Hello world'

  4. 目前,您可以通过前端或转到 www.example.com/api/test 访问它,但我想做的是不允许用户手动访问访问 link 或使用 curl 或邮递员来获取它,但只能通过前端访问它。

  5. 前端写在Angular2(如果有关系的话)

请注意,我不打算让任何用户登录该网站,我只是想限制对外部世界的 API 访问,这样只有我的前端才能访问它。

更新用例

以后的用例很简单。我有一个基本的注册表单,要求提供电子邮件地址和文字说明。然后我在后端使用 nodemailer 使用来自 Angular 的 POST 请求将该信息发送到 gmail 2. 我访问通过 req.on('data') 和 req.on('end') 并处理它。我担心的是如何确保我不会通过 API 收到垃圾邮件并收到 10k 封电子邮件,因此我希望以某种方式使 API 只能通过前端访问。

虽然您无法阻止 REST 服务被整个 Internet 调用,但您仍然可以阻止垃圾邮件: 无论您的服务是否需要身份验证,它始终是相同的机制,使用验证码(最重要的部分)并限制您的 API.

1。验证码:

确保客户端向服务器发出请求的最佳方式是验证码。

CAPTCHA :

A CAPTCHA (a backronym for "Completely Automated Public Turing test to tell Computers and Humans Apart") is a type of challenge-response test used in computing to determine whether or not the user is human.

您可以找到大量可以创建验证码的服务或库,例如 Google 的 reCAPTCHA

2。速率限制:

  • 对于 public 服务,您可以通过 IP 限制访问速率:如果同一 IP 为 10、100 甚至 1000请求(取决于该服务的目的),这有点可疑,因此您可以通过发送错误状态并将这种不公平行为记录到应用程序日志中来拒绝为他服务。所以系统管理员可以使用 fail2ban 之类的工具在防火墙级别禁止 IP。

  • 对于经过身份验证的服务,除了您可能还想根据 IP and 的身份,并且可能不想禁止经过身份验证的用户...

请注意,对于 public API,您实际上 没有 自己处理速率限制,这意味着阻止相同的 IP在 10 秒内向同一个 url 发出 1000 POST 请求是系统管理员可以而且应该完成的事情。