如何保护 JavaScript API 访问令牌?
Posted
技术标签:
【中文标题】如何保护 JavaScript API 访问令牌?【英文标题】:How to secure the JavaScript API Access Token? 【发布时间】:2015-10-15 03:47:55 【问题描述】:有许多在线资源提供 javascript API 来访问他们的服务。更清楚地说,我将基于MapBox 的示例提出问题,但这也适用于各个领域的许多其他服务。
当有人想在 Web 应用程序中使用此类服务(例如 MapBox 中的地图图像)时,他们通常需要注册/注册并获取 访问令牌 才能访问该服务.
现在,如果我从服务器端使用 API - 没有问题:我知道我的令牌安全地存储在服务器上的某个位置,并且仅在我的服务器和服务提供商之间进行通信时公开,这可以长是 HTTPS。但是,对于 JavaScript API(例如,如果我使用 Leaflet 从 MapBox 呈现地图),我应该在暴露给用户网络的 JavaScript 中有 我的访问令牌浏览器 - 因此查找某人的访问令牌变得非常容易。我的用户,或者在公共服务的情况下,实际上是任何人,都可以在浏览器的“开发工具”中找到令牌。
然而,就我而言,这个令牌应该被视为一种有意义的数据——服务使用情况是根据这个令牌提供的身份验证来跟踪的。如果您根据使用情况为服务付费,它就变得至关重要,但即使您不这样做(例如,如果您使用免费/入门/非付费计划) - 服务使用是有限的,我想确定一下只有我使用它。
我唯一的选择是通过我自己的网络服务器代理吗?
如果 JavaScript 在用户的浏览器中执行,是否有办法保护 JavaScript API 用于访问外部服务的访问令牌?
【问题讨论】:
不,如果客户端需要将该令牌发送到他们的服务器,那么客户端可以访问该令牌 - 没有办法绕过它。但是,有些身份验证架构不会为用户提供完整的秘密,请查看服务提供的内容。 【参考方案1】:您可能想阅读CORS headers 这些允许您限制可以调用远程 Web 服务的域。
【讨论】:
【参考方案2】:Javascript API 令牌(实际上是所有客户端令牌)对客户端始终可见(除非仅在服务器端使用它们,如在节点中)。没有办法解决这个问题。正如您所提到的,真正保护 API 密钥并将其保密的唯一方法是将其存储在服务器中,然后请求服务器代表客户端发出请求。
【讨论】:
【参考方案3】:使用 CORS 限制访问
使用 CORS 设置让您的网络服务器在 ajax 请求中返回访问令牌。可以使用此方法访问您的应用程序来捕获令牌。
向授权用户提供令牌
您还可以在您的网络服务器上添加身份验证,以向您允许的用户提供有限的访问权限。令牌可以使用此方法获取,但只能由授权用户获取。
代理请求
完全保护该令牌的唯一方法是通过您的服务器代理请求。使用此方法无法捕获令牌。请注意,这可能违反服务条款。
【讨论】:
【参考方案4】:我将只谈论 Mapbox 之类的地图图像 API,不幸的是,似乎只有 Google Maps、Here Maps、Bing Maps 等服务提供服务提供商的 IP/域过滤或此类安全性,所有提供都基于 OSM i遇到不建议。正如 Justin Poehnelt 所说,唯一可靠的方法是构建代理,但通常是被禁止的。我在the ToU of Mapbox 中找到了这个:
您不得重新分配地图资产,包括从缓存中,通过 代理,或使用屏幕截图或其他静态图片代替 通过 Mapping API 访问地图资产。
【讨论】:
【参考方案5】:5 年后,这不一定适用于原始发布者,但对于任何仍然感兴趣的人,Mapbox 现在允许您轻松地按域限制令牌:
https://account.mapbox.com/access-tokens(假设您已登录)
【讨论】:
以上是关于如何保护 JavaScript API 访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章
如何在javascript fetch中存储访问令牌并传递给下一个api调用