如何确保只有我的 javascript 客户端 Web 应用程序向 REST API 发出请求?

Posted

技术标签:

【中文标题】如何确保只有我的 javascript 客户端 Web 应用程序向 REST API 发出请求?【英文标题】:How to make sure that only my javascript client web app is making requests to REST API? 【发布时间】:2015-02-24 03:54:44 【问题描述】:

我正在构建一个 Web 应用程序。它基本上是一个博客。

有一个 javascript 客户端 Web 应用程序和一个实现 REST API 的服务器。

当用户访问我的博客时,我使用 javascript 函数 loadPosts() 使用 Ajax 将 GET 请求发送到服务器上的 myblog.com/api/posts 端点。服务器返回包含博客文章的 JSON 数组,客户端的 javascript 解析 JSON 并附加 html 以显示博客文章。

我遇到的问题是我觉得我的 REST API 不安全。

请记住,我不希望网站访问者必须登录才能查看博客文章。然而,似乎任何人都可以在他们的浏览器中输入myblog.com/api/posts 并从我的服务器获取包含所有博客文章的 JSON 响应。 这意味着其他人只需调用我的 REST API 就可以创建重复的博客并使用我在服务器上的数据!

因此我的问题是如何确保只有我的 javascript 客户端能够调用我的服务器并从我的 REST API 获取数据?请注意,我不希望我的博客访问者授权才能查看博客文章。

提前致谢!

【问题讨论】:

这个答案对你有帮助我认为***.com/a/13458888/1982426 关于用户必须登录的讨论。 除非您对他们进行身份验证,否则您无法像浏览器一样阻止某人发出 HTTP 请求。即便如此,他们仍然可以窃取您的数据。 【参考方案1】:

您可以使用以下方法。

    从 loadPosts() 方法传入客户端令牌。您可以使用 AES 或其他一些加密技术来加密令牌。 解密令牌以验证请求仅来自您的方法。 响应请求

由于您的 loadPosts() 是客户端 javascript 方法,因此即使这种方法也可能被黑客入侵。任何人都可以从他们那里得到你的令牌。

如果您想要更高的安全性,您可以在每次发出新请求时生成新令牌,并将相关信息(如 IP 地址或其他信息)存储在数据库中。然后您可以在 api 请求中验证该信息并做出相应的响应。

这完全取决于你想走多远。

希望对你有帮助

【讨论】:

以上是关于如何确保只有我的 javascript 客户端 Web 应用程序向 REST API 发出请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何确保我的应用程序只有一个实例运行?

如何确保我的 django 应用程序中只有 1 个模型创建迁移?

如何确保只有支持区域监控的设备才能在商店中看到我的应用?

如果连接是本地主机,如何使用 javascript 检查?

Redux saga:我如何确保只有我的 saga 能够更新某个状态?

如何确保只有在子线程启动后主线程才能继续?