从Javascript应用程序安全访问第三方API

从Javascript应用程序安全访问第三方API,javascript,angularjs,api,security,Javascript,Angularjs,Api,Security,我正在Angularjs中创建一个web应用程序,它显示来自第三方API(json)的数据。这不是一个免费的API,我必须根据调用的数量付费 我得到了一个API密钥,我这样调用它: 我想确保我的api密钥仅由我的web应用程序使用,因此我在服务器上创建了一个代理。现在,我的angular应用程序如下调用我的服务器: ,服务器使用保存在服务器上的密钥调用api,并将json数据返回给客户端。这样钥匙就保密了 但是,目前没有任何东西可以阻止其他人调用“myapiproxy”并获取数据 有没有办法确

我正在Angularjs中创建一个web应用程序,它显示来自第三方API(json)的数据。这不是一个免费的API,我必须根据调用的数量付费

我得到了一个API密钥,我这样调用它:

我想确保我的api密钥仅由我的web应用程序使用,因此我在服务器上创建了一个代理。现在,我的angular应用程序如下调用我的服务器: ,服务器使用保存在服务器上的密钥调用api,并将json数据返回给客户端。这样钥匙就保密了

但是,目前没有任何东西可以阻止其他人调用“myapiproxy”并获取数据

有没有办法确保只有我的应用程序才能获取数据,而其他人不能以我的费用调用api


我搜索了几个小时,没有找到一个真正可靠的答案。HTTP referer不是一个好的答案,因为它很容易被欺骗

看看JSON Web令牌 这是确保通话安全的好方法。它有角模-

当用户加载您的应用程序时,您可以在后端提供一个令牌JenRate并将其存储在本地存储中。
在每次api调用中,您可以检查此令牌是否真实。

在服务器上,您可以在会话后进行此调用。要进行会话,您必须使用用户名密码登录。我认为您的api支持某种身份验证。@Cyril该web应用程序是公开的。访问者不需要登录就可以使用它。我认为不可能确保仅从angular应用程序调用API而不使用客户端身份验证(例如,请参阅)。但是,您可以采取一些滥用检测手段,例如限制已连接客户端的请求速率,甚至在用户尝试太多请求时显示验证码。@Thylossus非常感谢您提供的信息和链接。不幸的是,也许你是对的,谢谢,但是JWT在我的情况下有用吗?在我的情况下,应用程序可以被所有访问者访问,而不仅仅是那些登录的人?是的。每位来访者都会收到自己的代币。您可以在后端检查此令牌,以便知道它不是您的应用程序用户。这个代币可以使用一定的时间,即使有人偷了它,它也会过期。但您必须检查主机头,以确保有人从您自己的前端调用您的api。或者,您可以设置auth0-他们很酷,有免费计划,允许用户登录社交提供商或paswordless auth。不幸的是,在我的情况下,要求访问者登录以查看内容不是一个选项。主机头,比如referer,可以被欺骗,但我想这总比没有好。也许我会结合限制来自同一IP的请求。