YouTube API V3 - HTTP 引用限制

YouTube API V3 - HTTP referrer restriction

我正在为我的应用程序使用 YouTube V3 API,现在我似乎遗漏了一些东西,因为我将密钥限制在我列出的网站上。当密钥完全不受限制时,该应用程序可以运行,但我不希望每个人和他们的妈妈都在他们的网站上使用我的密钥(我的代码在 GitHub - 这是一个普通的 JavaScript 应用程序所以我无法隐藏我的密钥)。这是我的提取调用...

fetch(baseURL)
    .then(response => response.json())
    .then(responseJson => displayYoutubeResults(responseJson))
    .catch(err => alert("YouTube's API is acting up again. Site Administrator is dealing with it.", err));

baseURL 只是进行 fetch 调用的 URL。既然我对密钥有限制,是否需要某种类型的 Header?

如果您的应用产生如下 JSON 错误响应:

{
  "error": {
    "code": 403,
    "message": "Requests from referer \u003cempty\u003e are blocked.",
    "errors": [
      {
        "message": "Requests from referer \u003cempty\u003e are blocked.",
        "domain": "global",
        "reason": "forbidden"
      }
    ],
    "status": "PERMISSION_DENIED"
  }
}

那么这意味着,实际上,您必须将调用 HTTP Referrer header 的 API 端点传递为:

fetch(baseURL, {
  referrer: "REFERRER"
})

其中 REFERRER 将被替换为与您在 Google 的开发人员控制台上选择复选框 HTTP Referrers (web sites) 时输入的 URL 模式匹配的值在 Application restrictions 部分下,并在 Website restrictions.

小节下添加一个或多个 URL 模式项

尽管如此,请记住,对您的 API 密钥使用这种应用程序限制并不能保护您免受(引述)每个人和他们的妈妈在他们的网站上使用您的密钥.是这样的,因为您说您的应用程序的源代码是 public(这意味着每个人都可以从源代码本身轻松读取有效的 HTTP 引荐来源网址)。


如果您将 API 关键 HTTP 引用限制(正如我上面提到的)设置为您网站的 URL(例如 http://www.foobar.com),则使用 referrerPolicy 为:

fetch(baseURL, {
  referrerPolicy: "origin"
})

您将避免在源代码本身中指定 URL http://www.foobar.com

但是,referrerPolicy 选项也不完全安全,因为感兴趣的 third-party 如果有关于您的应用程序的额外信息,仍然可以推导出您的 URL。