如何创建只能由前端访问的私有api?

Posted

技术标签:

【中文标题】如何创建只能由前端访问的私有api?【英文标题】:How to create private api that can only be accessed by the front-end? 【发布时间】:2017-08-14 09:29:57 【问题描述】:

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

我有以下设置:

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

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

    我有一个返回字符串“Hello world”的公共 API atm

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

    前端是用 Angular 2 编写的(如果它很重要的话)

请注意,我不打算让任何用户登录网站,我只是想限制外界对 API 的访问,以便只有我的前端可以获取它。

更新用例

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

【问题讨论】:

那可能是因为没有办法。 您可以使用令牌来限制非授权用户从 API 获取数据,但您不能限制您的 API 仅将数据传递到您的前端。因为你不能阻止用户从你加载的 html 代码中获取他需要的数据。 未来的用例很简单。我有一个基本的注册表单,要求提供电子邮件地址和文本描述。然后我在后端使用 nodemailer 使用来自 Angular 2 的 POST 请求将该信息发送到 gmail。我访问通过 req.on('data') 和 req.on('end') 发送的数据并处理它。我担心的是如何确保我不会通过该 API 收到垃圾邮件并收到 10k 封电子邮件,因此我希望以某种方式使 API 只能通过前端访问。 【参考方案1】:

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

1。验证码:

确保向服务器发出请求的客户端由人驱动的最佳方法是验证码。

CAPTCHA:

验证码(“完全自动化的公共图灵测试以区分计算机和人类”的反义词)是一种用于在计算中确定用户是否为人类的挑战-响应测试。

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

2。速率限制:

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

对于经过身份验证的服务,除了您可能还希望根据 IP其身份对 API 进行速率限制,并且可能不希望禁止经过身份验证的用户...

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

【讨论】:

这真的可以,非常感谢,我回家后会试试这个。

以上是关于如何创建只能由前端访问的私有api?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Node API 只能由 Web 应用程序访问?

仅由 API Gateway 访问的私有 S3 静态网站

无需用户登录即可保护 Spring Boot 应用程序

无权访问私有 MSMQ

如何确保客户端角度应用程序中的真正安全性

如何使用 AngularJS 保护 Laravel 4 中的 API 访问