如何保护 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 访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

JSON Web 令牌(JWT)是如何保护 API 的?

允许使用 Auth0 保护的 API 的开发人员访问令牌

使用客户端令牌保护 REST API 调用

如何在javascript fetch中存储访问令牌并传递给下一个api调用

无法验证从 Azure AD 获得的访问令牌签名以保护 Web API

是否可以通过我的逻辑使用 oauth 协议来创建 clientid 并生成访问令牌来保护 api?