我们正在用 JavaScript 构建一个与后端 REST 服务对话的公共单页应用程序。我们想要的是只能从单页应用程序访问该 REST 服务。
由于它是一个公共网站,我们不能/不希望用户输入身份验证详细信息。任何正常的身份验证机制都不起作用,因为存储在 JS 中的任何秘密对任何人都是可读的。
我认为保护 REST 服务是不可能的,因为它基本上必须是公开的,但我想知道是否有人知道如何阻止某人构建脚本并使用我们的 REST api 重现我们的应用程序。
我们正在用 JavaScript 构建一个与后端 REST 服务对话的公共单页应用程序。我们想要的是只能从单页应用程序访问该 REST 服务。
由于它是一个公共网站,我们不能/不希望用户输入身份验证详细信息。任何正常的身份验证机制都不起作用,因为存储在 JS 中的任何秘密对任何人都是可读的。
我认为保护 REST 服务是不可能的,因为它基本上必须是公开的,但我想知道是否有人知道如何阻止某人构建脚本并使用我们的 REST api 重现我们的应用程序。
如果这是本机应用程序,您可以尝试以下操作,
如果您不使用 HTTPS,您仍然可以在标头中手动对访问密钥进行哈希处理(只有您的服务器和应用程序逻辑知道如何操作),这样中间的人就不能假装是您的应用程序。
如果这是针对纯网络应用程序,
我首先建议将纯 Web 应用程序包装在本机应用程序(也称为混合应用程序)中,以便您可以通过在应用程序中捆绑密钥来实现上述保护。开发一个内部只有一个 Web 视图的原生应用程序不应该花费太多。
但是,如果这是不可能的,那么您的应用程序仍然是一个纯网络应用程序 - 这是一个潜在的选择,
这当然不是万无一失的,但如您所知,没有完美的安全性,这可能达到目的(并希望符合要求)。不过,我想说混合动力更具成本效益。
想到的第一个想法是使用会话或在您的页面上设置一些东西来记录传入连接的 IP,并且只允许 REST API 响应最近访问您的主页的 IP。这不会阻止所有情况,但这确实意味着必须至少定期访问主站点才能使用 REST API。
但从根本上说,如果用户不需要进行身份验证,那么没有什么可以阻止屏幕抓取工具有效地从您的站点提取数据。业务规则应该由 REST API 强制执行,因此 REST API 应该有效地成为您的网站,并且使用它的页面应该只是为显示提供格式。
这可能会有所帮助。您可以做很多事情来确保您的休息服务。一种是 CORS 并使用 PUT/Delete,因为这些标头不能跨域设置。 http://www.nsa.gov/ia/_files/support/guidelines_implementation_rest.pdf