如何从 AngularJS 站点安全地连接到 web api

Posted

技术标签:

【中文标题】如何从 AngularJS 站点安全地连接到 web api【英文标题】:How to securely connect to a web api from a AngularJS site 【发布时间】:2015-03-07 11:30:35 【问题描述】:

对于 Web 开发来说相对较新,至少使用 AngularJS 框架等客户端技术,我需要先解决一些查询,然后才能开始我的最新项目。

我正在使用 AngularJS 编写一个应用程序,它读取/写入/更新数据库中的数据。由于 javascript 作为客户端,我选择编写一个 php REST API 来执行数据库查询,从而产生安全的用户名和密码以及单个数据库层。

我的问题是,鉴于我的 REST API,我将使用来自 javascript(客户端)的 AJAX 来调用方法。如何阻止其他网站也编写脚本来调用 REST API?将身份验证令牌放入 javascript 代码中不是很安全,有人可以复制它。

REST API 是解决此问题的最佳方法吗?我并不反对学习新技术或实践,所以请,任何关于更好的设计模式或实现方法的想法都非常感谢。不幸的是,由于我在这方面的领域知识有限,我的 Google 搜索一直没有成果,因为我对应该搜索的字词没有信心。

非常感谢。

【问题讨论】:

【参考方案1】:

由于您的 Angular 应用程序存在于浏览器中,因此您的 REST API 需要可从任何随机访问者的浏览器公开访问。因此,出于必要,您拥有一个公共 API。你不能限制它;访问者可以查看数据,或者不能。

不过,这与传统网页本质上并没有太大区别。在服务器端生成的页面中,您输出打包为 html 的数据并将其交付给任何询问的人。在 REST-API/Angular 应用程序中,您将打包为 JSON 的数据提供给任何提出要求的人。无论哪种方式,数据都是同样公开的,尽管 REST API 可能比抓取 HTML 更容易“滥用”。如果您想避免有人彻底吸干您的所有数据库,那么故意使用一些用户行为跟踪和限制可能会很有用;这同样适用于基于 JSON 的 REST API,就像它适用于常规网页一样。

如果您还以这种方式公开 read/write API,那么您当然很容易受到滥用。

使 API 不公开的唯一方法是要求密码验证。如果您站点的用户必须登录,那么您可以将 API 限制为具有有效会话的任何人。如果任何人都可以简单地在您的网站上注册一个帐户,这对授权计划没有多大帮助,但它需要更多的考虑,并且比完全开放的 API 提供更多的可管理性。

当然,仅限管理员的 API 必须以这种方式受到保护,需要一个只有您拥有凭据的帐户。

【讨论】:

感谢您的回复。这是我的想法/担忧,即 REST API 根让您对各种连接敞开大门,并且您几乎无法有效地限制发起者。这是否表明有更好的方法可用?我认为必须有一种从客户端应用程序安全地执行服务器端代码的方法? 但是,请再次接受:无论如何都要在公共网站上公开这些数据。 REST API 和 HTML 页面之间的技术区别是微不足道的。只是不要公开你不想公开的东西。我可以编写一个程序来抓取您的所有 HTML 页面并从中提取所有信息。最后,它给了我与您的 JSON API 相同的结果。以这种方式做这件事需要做更多的工作,但意义不大。 数据将显示在公开的网站上,但是,用户必须登录才能查看此页面。我主要担心的是用户可以登录,学习通过 API 访问数据的方法,然后跑掉从他自己的站点访问数据。登录仅为用户创建,他们不能自己创建,但如果要使用用户的凭据打开一个新站点,最初可能很难捕获。 与传统网站仍然没有区别。什么是用户认证?它是一个额外的 HTTP 标头(通常为:Cookie)。而已。任何人都可以随时随地使用该标头发出 HTTP 请求。只要他们为 cookie 发送一个有效值,他们就“在”。您可以为您的 REST API 使用完全相同的特性。 @deceze 我正在开发一个 Angular 5 Web 应用程序,该应用程序是关于参加在线考试并立即告知结果。尝试测试后,客户端将向服务器请求正确答案列表,然后将用户的答案与从 firebase 服务器收到的正确答案进行比较。如果注册用户可以访问存储在firebase服务器上的正确答案API,他将能够知道正确答案,这将是失败的。你能告诉我在这种情况下我能做什么吗?有什么建议吗?

以上是关于如何从 AngularJS 站点安全地连接到 web api的主要内容,如果未能解决你的问题,请参考以下文章

如何从无服务器应用程序安全地连接到 AWS DynamoDB 或其他 aws 数据库

如何使用 PHP 安全地连接到内部网络 SQLSRV 数据库?

如何使用 GUI 工具安全地连接到 GKE 中的数据库?

将存储安全地连接到 Azure Data Lake Analytics 或数据工厂

对于从 API 中提取的 AngularJS 安全站点,我应该使用啥 oAuth2 Grant

如何从亚马逊 vpc 连接到外部世界?