Google Cloud Translate API & Referer 限制问题

Google Cloud Translate API & Referer Restriction Issue

我对 Google 云翻译 API 有一个令人沮丧的问题。

我正确设置了密钥对某些域的限制,包括 *.example.com/ *(末尾没有空白 space)

我在 URL https://www.example.com/translate 上启动脚本,我收到以下消息:

"status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "API_KEY_HTTP_REFERRER_BLOCKED",
        "domain": "googleapis.com",

当我取消限制时,一切正常,但我需要限制以避免 misuse/abuse。

此外,我为其他人使用相同的 API 密钥 Google App API(地图、Auth 等),它在这个域中完美运行...

太奇怪了。

您有什么想法或方法可以更好地调查这个问题吗? 我怎么知道推荐人 Google 看到了? (或任何外部服务)

非常感谢!!


编辑:

PHP代码:

require_once(APPPATH . "libraries/GoogleTranslate/vendor/autoload.php");
require_once(APPPATH . "libraries/GoogleTranslate/vendor/google/cloud-translate/src/V2/TranslateClient.php");
    

    $translate = new TranslateClient([
      'key' => 'xXXXx'
    ]);

    // Translate text from english to french.
    $result = $translate->translate('Hello world!', [
      'target' => 'fr'
    ]);

    echo $result['text'];

完整的错误信息:

Type: Google\Cloud\Core\Exception\ServiceException



 Message: { 
"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", 
"details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", 
"reason": "API_KEY_HTTP_REFERRER_BLOCKED", 
"domain": "googleapis.com", 
"metadata": { "service": "translate.googleapis.com", "consumer": "projects/XXXXX" } } ] } }

Filename: htdocs/application/libraries/GoogleTranslate/vendor/google/cloud-core/src/RequestWrapper.php

Line Number: 368

我看了评论,你似乎一切都很好。我建议您尝试:

  • 之所以会出现这个错误信息,是因为你在API键中设置了API限制,是这样吗?也许您正在限制这个特定的 API.
  • 如果您没有设置任何 API 限制,是否可以仅出于测试目的尝试添加 IP 而不是域?

我将在这里留下我在 Public 问题跟踪器上讨论的见解。

HTTP 限制按预期工作,但 referer 始终为空 因为这不是默认设置。但是,它可以手动添加,所以不要这样做:

-$translate = new TranslateClient([
'key' => 'XXX'
]);

您需要指定推荐人:

-$translate = new TranslateClient([
'key' => '[API_KEY]',
'restOptions' => [
   'headers' => [
       'referer' => '*.[URL].com/*'
   ]
]
]);

您必须考虑到此类请求可以从 任何计算机(如果您有密钥)发送,因为您没有限制请求所在的域制作完成,只检查谁是推荐人(您可以手动设置)。此外,API 客户端 运行 在 Web 浏览器上 公开他们的 API 密钥 ;这就是为什么我建议您使用 service accounts instead. For more information: adding application restrictions.


关于 HTTP referer, this is basically a header field that, basically, the web browsers put to let the web page know where the user is coming from. For example, if you click the above link (HTTP referer) your referer field will be this 页。


总而言之,由于您可以在请求的 header 中放置任何 referer,这与没有任何类型的限制非常相似。的确,推荐使用service accounts。要轻松解决此问题,请在上面代码中公开的 header 中手动添加 referer