【问题标题】:Authentication for in-browser client-side APIs?浏览器内客户端 API 的身份验证?
【发布时间】:2012-05-18 17:06:59
【问题描述】:

我正在考虑使用 Google Static Maps API,它将您的静态地图限制为 1000 个,如果您注册一个帐户,则可以更多。当客户端上的所有内容都是公开的时,他们如何跟踪帐户等?

对于大多数服务器到服务器 API,我获得了 access_token/key/etc。我可以将其传递给服务以证明我确实是我,但在客户端上任何此类 access_token/key/etc。将立即成为公众知识。

一般来说,客户端库(FB SDK、Stripe、Google 等)使用什么策略来执行身份验证,以及它们如何绕过客户端上的所有内容都是公开的这一事实?

【问题讨论】:

  • 使用谷歌静态地图,仍然需要向谷歌服务器请求地图图像,因此可以在那时检测到使用情况;他们可能使用客户端发送的 HTTP 引用信息将每个请求分配给一个帐户。你到底想完成什么?
  • 我想我的问题是:Google 怎么知道它实际上是我网站上请求图片的页面?是什么阻止了某人从我的一个页面复制 URL、更改参数并在自己的网站上使用它、在此过程中用完我的配额?
  • 用户的浏览器在其向 Google 请求的标题信息中包含了引用页面的地址......虽然用户自己可以操纵它来误报其他人的网站(为了什么目的?),它是不是其他网站能够以您描述的方式做的事情。
  • @eggyal 你能详细说明一下吗?我不知道引荐来源头信息是如何工作的,也不知道如何获取/使用它作为服务器或使用 S3/cloudfront。我可以去学习的链接也很棒=)
  • 当浏览器向网络服务器请求资源时,它会在“request headers”中包含引用页面的 URL。因此,服务器可以确定(例如)它所服务的图像嵌入在哪个页面上(假设浏览器没有被操纵以误报此信息)。您如何阅读本文取决于所使用的服务器端技术:例如,在 PHP 中,您可以只检查 $_SERVER['HTTP_REFERER']

标签: authentication client


【解决方案1】:

您可以将您的 API 密钥配置为将 by host 列入白名单,这会告诉 Google 地图仅允许从发送与您的白名单匹配的引荐来源网址的网站使用 API 密钥。

如果其他网站使用您的 API 密钥,他们将在加载时收到此错误消息:

此网站需要不同的 Google Maps API 密钥。可以在http://code.google.com/apis/maps/documentation/javascript/v2/introduction.html#Obtaining_Key 生成新密钥。

您可以使用 FireFox 的 RefControl extension 自行验证:

之所以有效,是因为:

  • 几乎所有网络浏览器都会在请求中发送引荐来源网址(i.e., the URI of the resource which links to it)
  • 如果有人窃取您的 API 密钥(正如您所说,它是一个公开可用的字符串),他们需要告诉所有用户覆盖他们的引荐来源网址以匹配他们从中窃取它的网站(这显然不切实际)。

请注意,Google 似乎允许不包含引荐来源网址的请求 - 我猜配置为排除此信息的浏览器数量微乎其微,因此不值得关注。

【讨论】:

    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2012-11-03
    • 2014-01-04
    相关资源
    最近更新 更多