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

相对较新的Web开发,至少使用AngularJS框架等客户端技术,我需要解决一个问题 在我开始我的最新项目之前几个查询。</ p>

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

我的问题是,鉴于我的 REST API,我将使用javascript(客户端)的AJAX来调用方法。 如何阻止其他站点编写脚本以调用REST API? 在javascript代码中放置身份验证令牌并不十分安全,有人可以复制它。 </ p>

REST API是解决此问题的最佳方法吗? 我并不反对学习新技术或实践,所以,对于更好的设计模式或实施方法的任何想法都非常感谢。 不幸的是,由于我在这方面的领域知识有限,我在 Google搜索</ em>中一​​直没有用,因为我对我应该搜索的条款没有信心。</ p>
\ 非常感谢。</ p>
</ div>

展开原文

原文

Being relatively new to web development, at least using client side technologies such as the AngularJS framework, I need to resolve a few queries before I can start my latest project.

I am writing an application using the AngularJS which reads/writes/updates data in a database. With javascript being client side I have chosen to write a PHP REST API to do the database queries, resulting in a secure username and password and a single database layer.

My question is, given my REST API, I will be using AJAX from javascript (which is client side) to invoke methods. How do I stop other sites from writing a script to invoke the REST API as well? Putting an authentication token in the javascript code isn't very secure, someone can just copy it.

Is a REST API the best approach for this problem? I am not adverse to learning new technologies or practices so please, any thoughts on better design patterns or methods of implementation are greatly appreciated. Unfortunately, due to my limited domain knowledge in this area, I have been unfruitful in my Google Searches as I'm not confident of the terms under which I should be searching.

Many thanks.

1个回答



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

基本上,这与传统网页没有显着差异。 在服务器端生成的页面中,您输出打包为HTML的数据并将其提供给任何要求的人。 在REST-API / Angular应用程序中,您将打包为JSON的数据提供给任何要求的人。 无论哪种方式,数据都是公开的,尽管REST API比抓取HTML更容易“滥用”。 如果你想避免有人直接吮吸你所有的数据库,那么考虑使用一些用户行为跟踪和限制可能是有用的; 这同样适用于基于JSON的REST API,也适用于常规网页。</ p>

如果您还公开读/ 写</ strong> </ em> 通过这种方式API,您当然可以滥用。</ p>

使API非公开的唯一方法是要求密码验证。 如果您网站的用户必须登录,则可以将API限制为具有有效会话的任何人。 如果任何人只能在您的网站上注册一个帐户,这对资助方案没有多大帮助,但它需要更多的审议,并提供比完全开放的API更多的可管理性。</ p>

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

展开原文

原文

Since your Angular application is living in the browser, your REST API will need to be publicly accessible from any random visitor's browser. You thereby have a public API, out of necessity. You can't restrict it; either visitors can see the data or they can't.

Essentially this is not significantly different from a traditional webpage though. In a server-side generated page, you output your data packaged as HTML and deliver it to anyone who asks. In a REST-API/Angular app, you deliver the data packaged as JSON to anyone who asks. Either way the data is equally public, though maybe the REST API is a little easier to "abuse" than scraping the HTML would be. It may be useful to deliberate employing some user behaviour tracking and throttling, if you want to avoid someone outright sucking all of your database dry; this applies equally to JSON based REST APIs as it does to regular web pages.

If you're also exposing read/write APIs this way, you're of course wide open to abuse.

The only way to make an API non-public is to require password authentication. If the users of your site must be logged in, then you can restrict the API to anyone with a valid session. This doesn't help much in the grant scheme of things if anyone can simply register an account on your site, but it needs more deliberation and provides slightly more manageability than a completely open API.

Admin-only APIs of course must be protected in this way, requiring an account which only you have the credentials to.

donglu5041
donglu5041 kk谢谢:)
接近 3 年之前 回复
dongxixia6399
dongxixia6399 将答案发送到服务器并让服务器回答答案是否正确。 切勿向客户端公开解决方案列表。 如果您的服务器无法进行必要的计算(我不知道Firebase是否执行),那么您需要使用其他服务器组件。
接近 3 年之前 回复
dongnai2804
dongnai2804 我正在开发一个Angular 5 Web应用程序,该应用程序是关于参加在线考试并立即告知结果。 在尝试测试之后,客户端将向服务器请求正确答案的列表,然后它将用户的答案与从firebase服务器收到的正确答案进行比较。 如果注册用户可以访问存储在firebase服务器上的正确答案的API,他将能够知道将是失败的正确答案。 能否告诉我在这种情况下我该怎么办? 有什么建议吗?
接近 3 年之前 回复
douzheren3349
douzheren3349 与传统网站没什么区别。 什么是用户身份验证? 它是一个额外的HTTP标头(通常是:Cookie)。 而已。 任何人都可以随时随地使用该标头发出HTTP请求。 只要他们为cookie发送有效值,他们就会“进入”。 您可以为REST API利用完全相同的特性。
接近 6 年之前 回复
dpbl91234
dpbl91234 数据将显示在公共站点上,但是,用户必须登录才能查看此页面。 我主要担心的是用户可以登录,了解通过API访问数据的方法,然后逃离从他自己的站点访问数据。 登录仅为用户创建,他们无法自己创建,但如果使用用户凭据打开新站点,则最初可能难以捕获。
接近 6 年之前 回复
duandaotuo5542
duandaotuo5542 但同样:对你在公共网站上公开这些数据的想法感到满意。 REST API和HTML页面之间的技术区别是微不足道的。 只是不要公开披露您不想公开披露的内容。 我可以编写一个程序来抓取所有HTML页面并从中提取所有信息。 最后,它给出了与JSON API相同的结果。 用这种方式做的工作要多得多,但不是很明显。
接近 6 年之前 回复
duanfan1965
duanfan1965 感谢您的回复。 这是我的想法/关注,REST API根目录让您对各种连接都敞开大门,并且您无法有效地限制创建者。 这是否表明有更好的方法? 我假设必须有一种安全地从客户端应用程序执行服务器端代码的方法吗?
接近 6 年之前 回复
立即提问