【问题标题】:Google Cloud Translate API & Referer Restriction Issue谷歌云翻译 API 和引用者限制问题
【发布时间】:2021-12-31 00:19:15
【问题描述】:

我对 Google Cloud Translate API 有一个令人沮丧的问题。

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

我在 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",

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

此外,我对其他 Google App API(地图、身份验证等)使用相同的 API 密钥,并且它在该域中完美运行...

好奇怪。

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

非常感谢!!


编辑:

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

【问题讨论】:

  • 你是如何添加限制的?你有没有遵循的指南?
  • @Latra 感谢您的回复!我正在通过 Google Cloud Console => API & Credentials 添加限制您在那里创建您的密钥并定义限制,在同一页面上有一个指导方针。我尊重所有,但它不起作用。很奇怪。
  • Hmmmm 基于documentation,通配符可以用于子域和/或路径,但不能用于协议,所以可能需要指定https:https://*.example.com/*跨度>
  • @Latra 感谢您的回复,我满怀希望地实现了它,但它仍然不起作用...... :(
  • 您能否提供有关您如何执行此过程的完整步骤?这可能有助于重现您的情况

标签: php google-cloud-platform google-translate google-translation-api


【解决方案1】:

我将在此处留下我在公共问题跟踪器上讨论的见解。

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

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

您需要指定推荐人:

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

您必须考虑到这种类型的请求可以从任何计算机(如果您有密钥)发送,因为您没有限制发出请求的域,只检查谁是推荐人(您可以手动设置)。此外,在网络浏览器上运行的 API 客户端公开其 API 密钥;这就是为什么我建议你改用service accounts。欲了解更多信息:adding application restrictions


关于HTTP referer,这基本上是一个标头字段,基本上,网络浏览器放置它让网页知道用户来自哪里。例如,如果您点击上面的链接 (HTTP referer),您的 referer 字段将是 this 页面。


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

【讨论】:

  • 非常感谢卡洛斯,抱歉耽搁了!您的解决方案解决了这个问题,但不幸的是,正如您自己所说,这不是一个长期的解决方案,但至少它有效。还没有时间使用服务帐户检查您的长期解决方案,希望它能正常工作。无论如何,感谢 A LOOOOOT 为您在此问题上花费的时间!你是最棒的!
  • 不客气,我很高兴它成功了!!
【解决方案2】:

我阅读了 cmets,您似乎一切正常。我建议你试试:

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

【讨论】:

  • 感谢您的回复!我对 HTTP 引用添加了限制,这就是问题所在。没有限制=一切正常。使用 IP 限制 = 一切正常。带有 HTTP 引荐来源网址限制:BUG...
  • 我不知道我们是否指的是相同的限制,因为每个部分都有“限制”一词?。在 key 限制 页面中,您为 HTTP 引用设置了 应用程序限制,但在 API 限制 中,您是否限制了任何 API?
  • 哦,对不起,我确实误解了你的评论。所以,我设置了应用程序限制但不是 API 限制。仅限 HTTP 引荐来源网址限制。
  • 看起来很奇怪,是的……我知道这听起来有点“愚蠢”,但您可以尝试设置 API 限制 以专门允许 Cloud Translation API 吗?
  • 所以我将 API 限制添加到 Application Restriction => FAILS,然后我删除了 Application Restriction 并仅保留 API 限制 => WORKS 回到 Application Restriction 的相同问题...我不明白......这让我发疯了?
猜你喜欢
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2011-05-22
  • 2019-03-05
相关资源
最近更新 更多