php Google Cloud Translate API和Referer限制问题

t98cgbkg  于 12个月前  发布在  PHP
关注(0)|答案(4)|浏览(188)

我有一个令人沮丧的问题与谷歌云翻译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",

字符串
当我删除限制时,一切正常,但我需要限制来避免误用/滥用。
此外,我使用这个相同的API密钥为其他谷歌应用程序API(Map,身份验证等),它的工作完美地从这个领域.
太奇怪了
你有任何想法或任何方法来更好地调查这个问题吗?我怎么能知道谷歌看到的推荐人?(或任何外部服务)
非常感谢!!
编辑:
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

ckx4rj1h

ckx4rj1h1#

我将在这里留下我在公共问题跟踪器上讨论的见解。
HTTP限制按预期工作,但referer始终为空,因为默认情况下没有设置。但是,它可以手动添加,所以不要这样做:

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

字符串
您需要指定代理人:

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


您必须考虑到这种类型的请求可以从任何计算机发送(如果你有密钥)因为你没有限制请求的域,只检查谁是请求者。(您可以手动设置)。此外,在Web浏览器上运行的API客户端会公开其API密钥;这就是为什么我建议你使用service accounts。更多信息:添加应用程序限制。
关于HTTP referer,这基本上是一个头字段,基本上,Web浏览器将其放在让网页知道用户来自哪里。例如,如果您单击上面的链接(HTTP referer),则referer字段将是this页面。
总之,由于您可以将任何referer放在请求的头部中,这与没有任何类型的限制非常相似。实际上,建议使用service accounts。为了轻松解决这个问题,请手动将referer添加到头部中,如上面的代码所示。

voase2hg

voase2hg2#

我看了评论,你似乎做得很好。我建议你试试:

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

soat7uwm3#

我有同样的问题与谷歌翻译,但不是与Map。所以Map工程与翻译限制,但翻译不。
我发现的唯一解决方案,在有效的限制,是设置一个IP限制,而不是HTTP代理(网站)。

k4ymrczo

k4ymrczo4#

对我来说,上面的例子给了我一些见解,我能够修改我的代码,使其工作。我添加了我的代码片段,以及我如何为HTTP请求添加自定义头。我希望这给其他人一些线索或解决他们的问题。

<?php

// Replace 'YOUR_API_KEY' with your actual API key
$apiKey = 'YOUR_API_KEY';

// Get the search query from the client-side
$searchQuery = "tacobytes";

// Set custom headers for the HTTP request
$contextOptions = [
    'http' => [
        'header' => 'referer: *.yourdomain.com/*',
    ],
];

$context = stream_context_create($contextOptions);

// Make a request to the YouTube Data API with the custom context
$apiUrl = 'https://www.googleapis.com/youtube/v3/search';
$apiParams = [
    'part' => 'snippet',
    'type' => 'video',
    'q' => $searchQuery,
    'maxResults' => 2,
    'key' => $apiKey,
];

$apiUrl .= '?' . http_build_query($apiParams);

// Make the request to YouTube API with the custom context
$response = file_get_contents($apiUrl, false, $context);

// Return the JSON response to the client
header('Content-Type: application/json');
echo $response;
?>

字符串

相关问题