如何保护 JavaScript API 访问令牌?
How to secure the JavaScript API Access Token?
有许多在线资源提供 JavaScript API 访问他们的服务。更清楚地说,我的问题将基于 MapBox 的示例,但这适用于各个领域的许多其他服务。
当有人想在 Web 应用程序中使用此类服务时(例如来自 MapBox 的地图图像),他们通常需要 Register/Sign 获取 访问令牌 访问服务。
现在,如果我从服务器端使用 API - 没有问题:我知道我的令牌安全地存储在服务器的某个地方,并且仅在我的服务器与服务之间进行通信时公开提供者,只要是 HTTPS 就可以。但是,在 JavaScript API 的情况下(例如,如果我使用 Leaflet 从 MapBox 渲染地图),我应该有 我的访问令牌 在 JavaScript 中暴露给用户的网络浏览器 - 因此它使得找到某人的访问令牌变得非常容易。我的用户,或者在 public 服务的情况下,实际上是任何人,都能够在浏览器的“开发工具”中找到令牌。
然而,对于我而言,此令牌应被视为敏感数据 - 服务使用情况是根据此令牌提供的身份验证进行跟踪的。如果您根据其使用情况为服务付费,它就变得至关重要,但即使您不这样做(例如,如果您使用 Free/Starter/Non 付费计划)- 服务使用是有限的,我想确定它只有我一个人在用
我唯一的选择是通过我自己的网络服务器代理吗?
如果 JavaScript 在用户的浏览器中执行,是否有办法保护 JavaScript API 用于访问外部服务的访问令牌?
您可能想继续阅读 CORS headers
这些允许您限制哪个域可以调用远程 Web 服务。
Javascript API 令牌(以及所有客户端令牌,事实上)始终对客户端可见(除非仅在服务器端使用它们,如在节点中)。没有办法解决这个问题。正如您所提到的,真正保护 API 密钥并将其保密的唯一方法是将其存储在服务器中,然后请求服务器代表客户端发出请求。
使用 CORS 限制访问
使用 CORS 设置,让您的 Web 服务器 return 收到您 javascript 的 ajax 请求的访问令牌。可以使用此方法访问您的应用程序来捕获令牌。
向授权用户提供代币
您还可以在您的网络服务器上添加身份验证,以向您允许的用户提供有限的访问权限。可以使用此方法捕获令牌,但只能由授权用户捕获。
代理请求
完全保护该令牌的唯一方法是通过您的服务器代理请求。使用此方法无法捕获令牌。请注意,这可能违反服务条款。
我只会谈论像 Mapbox 这样的地图图像 API,不幸的是,似乎只有 Google 地图、Here 地图、Bing 地图等服务提供 ip/domain 由服务提供商过滤或这种类型的安全性,我遇到的所有基于 OSM 的报价都不建议使用。正如 Justin Poehnelt 所说,唯一可靠的方法是构建代理,但通常被禁止。我在 the ToU of Mapbox:
中找到了这个
You may not redistribute Map Assets, including from a cache, by
proxying, or by using a screenshot or other static image instead of
accessing Map Assets through the Mapping APIs.
5 年后,这不一定适用于原始发布者,但对于仍然感兴趣的任何人,Mapbox 现在允许您轻松地按域限制令牌:
有许多在线资源提供 JavaScript API 访问他们的服务。更清楚地说,我的问题将基于 MapBox 的示例,但这适用于各个领域的许多其他服务。
当有人想在 Web 应用程序中使用此类服务时(例如来自 MapBox 的地图图像),他们通常需要 Register/Sign 获取 访问令牌 访问服务。
现在,如果我从服务器端使用 API - 没有问题:我知道我的令牌安全地存储在服务器的某个地方,并且仅在我的服务器与服务之间进行通信时公开提供者,只要是 HTTPS 就可以。但是,在 JavaScript API 的情况下(例如,如果我使用 Leaflet 从 MapBox 渲染地图),我应该有 我的访问令牌 在 JavaScript 中暴露给用户的网络浏览器 - 因此它使得找到某人的访问令牌变得非常容易。我的用户,或者在 public 服务的情况下,实际上是任何人,都能够在浏览器的“开发工具”中找到令牌。
然而,对于我而言,此令牌应被视为敏感数据 - 服务使用情况是根据此令牌提供的身份验证进行跟踪的。如果您根据其使用情况为服务付费,它就变得至关重要,但即使您不这样做(例如,如果您使用 Free/Starter/Non 付费计划)- 服务使用是有限的,我想确定它只有我一个人在用
我唯一的选择是通过我自己的网络服务器代理吗?
如果 JavaScript 在用户的浏览器中执行,是否有办法保护 JavaScript API 用于访问外部服务的访问令牌?
您可能想继续阅读 CORS headers 这些允许您限制哪个域可以调用远程 Web 服务。
Javascript API 令牌(以及所有客户端令牌,事实上)始终对客户端可见(除非仅在服务器端使用它们,如在节点中)。没有办法解决这个问题。正如您所提到的,真正保护 API 密钥并将其保密的唯一方法是将其存储在服务器中,然后请求服务器代表客户端发出请求。
使用 CORS 限制访问
使用 CORS 设置,让您的 Web 服务器 return 收到您 javascript 的 ajax 请求的访问令牌。可以使用此方法访问您的应用程序来捕获令牌。
向授权用户提供代币
您还可以在您的网络服务器上添加身份验证,以向您允许的用户提供有限的访问权限。可以使用此方法捕获令牌,但只能由授权用户捕获。
代理请求
完全保护该令牌的唯一方法是通过您的服务器代理请求。使用此方法无法捕获令牌。请注意,这可能违反服务条款。
我只会谈论像 Mapbox 这样的地图图像 API,不幸的是,似乎只有 Google 地图、Here 地图、Bing 地图等服务提供 ip/domain 由服务提供商过滤或这种类型的安全性,我遇到的所有基于 OSM 的报价都不建议使用。正如 Justin Poehnelt 所说,唯一可靠的方法是构建代理,但通常被禁止。我在 the ToU of Mapbox:
中找到了这个You may not redistribute Map Assets, including from a cache, by proxying, or by using a screenshot or other static image instead of accessing Map Assets through the Mapping APIs.
5 年后,这不一定适用于原始发布者,但对于仍然感兴趣的任何人,Mapbox 现在允许您轻松地按域限制令牌: