如何保护JavaScript API访问令牌?

Tim*_*mur 46 javascript security leaflet mapbox

有许多在线资源提供JavaScript API来访问他们的服务.为了更清楚,我将基于MapBox的示例提出问题,但这适用于各种域中的许多其他服务.

当有人想在Web应用程序中使用此类服务​​时(例如来自MapBox的地图图像),他们通常需要注册/注册并获取访问令牌才能访问该服务.

现在,如果我将从服务器端使用API​​ - 没有问题:我知道我的令牌安全地存储在服务器上的某个地方,并且仅在我的服务器和服务提供商之间的通信时"暴露".但是,在JavaScript API的情况下(例如,如果我使用Leaflet从MapBox渲染地图),我应该在JavaScript中将访问令牌暴露给用户的Web浏览器 - 因此它非常容易找到某人的访问令牌.在我的例子中,只需使用Leaflet访问任何网站并在Firefox中打开"开发工具",就可以在一分钟细致地阅读他们的JavaScript代码时显示他们使用的令牌.

然而,对于我来说,这个令牌应被视为非常安全的数据 - 基于此令牌提供的身份验证来跟踪服务使用情况.如果您根据其使用情况支付服务费用就变得非常关键,但即使您没有(例如,如果您使用免费/入门/非付费计划) - 服务使用有限,我想确定只有我使用它.

显然,有一些策略,例如服务提供商的IP /域过滤,但似乎并非所有服务提供商都支持这种策略 - 例如,MapBox似乎没有(或者我没有找到它).或者,最终,我可以通过我的网络服务器代理服务,但这非常重.

考虑到所有这些 - 有没有办法保护JavaScript API使用的访问令牌访问外部服务,前提是JavaScript是在用户的浏览器中执行的?

Jus*_*elt 14

使用CORS限制访问

让您的Web服务器在您使用CORS设置的javascript的ajax请求中返回访问令牌.可以使用此方法访问您的应用程序捕获令牌.

为授权用户提供令牌

您还可以在Web服务器上添加身份验证,以便为您允许的用户提供有限的访问权限.可以使用此方法捕获令牌,但只能由授权用户捕获.

代理请求

完全保护该令牌的唯一方法是通过您的服务器代理请求.使用此方法无法捕获令牌.


小智 10

5 年后,这不一定适用于原始海报,但对于仍然感兴趣的任何人,Mapbox 现在允许您轻松地按域限制令牌:

https://account.mapbox.com/access-tokens(假设您已登录)


小智 9

Javascript API令牌(实际上是所有客户端令牌)始终对客户端可见(除非仅在服务器端使用它们,如在节点中).没有办法解决这个问题.正如您所提到的,真正保护API密钥并使其保密的唯一方法是将其存储在服务器中,然后请求服务器代表客户端发出请求.


Cin*_*inn 6

我将只讲诸如Mapbox之类的地图图像API,似乎不幸的是,只有Google Maps,Here Maps,Bing Maps等服务通过服务提供商提供IP /域过滤或这种类型的安全性,所有基于我遇到的OSM的提议都不提供。提出来。正如贾斯汀·波内尔特(Justin Poehnelt)所说,唯一可靠的方法是建立代理,但通常是禁止的。我在Mapbox的ToU中找到了这个:

您不得通过代理或使用屏幕截图或其他静态图像来重新分配地图资产,包括从缓存中进行分配,而不是通过Mapping API访问地图资产。