Tengo un problema frustrante con la API de Google Cloud Translate.
Configuré correctamente la restricción de la clave a algunos dominios incluyendo *.example.com/ * (sin espacio en blanco al final)
Lanzo el script en la URL https://www.example.com/translate y tengo el siguiente mensaje:
"status": "PERMISSION_DENIED", "details": [ { "@type": "type.googleapis.com/google.rpc.ErrorInfo", "reason": "API_KEY_HTTP_REFERRER_BLOCKED", "domain": "googleapis.com",Cuando elimino la restricción, todo funciona, pero necesito la restricción para evitar el mal uso/abuso.
Además, uso esta misma clave API para otras API de aplicaciones de Google (mapas, autenticación, etc.) y funciona perfectamente desde este dominio...
Tan raro.
¿Tiene alguna idea o forma de investigar mejor este problema? ¿Cómo puedo saber el referente que ve Google? (o cualquier servicio externo)
Muchas gracias !!
Editar :
codigo 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'];Mensaje de error completo:
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: 368Leí los comentarios y parece que lo estás haciendo todo bien. Te recomendaría probar:
Dejaré aquí mis ideas discutidas en el Public Issue Tracker.
La restricción HTTP funciona según lo previsto, pero el referer siempre está vacío porque no está configurado de forma predeterminada. Sin embargo, se puede agregar manualmente, así que en lugar de hacer:
-$translate = new TranslateClient([ 'key' => 'XXX' ]);Debe especificar el referente:
-$translate = new TranslateClient([ 'key' => '[API_KEY]', 'restOptions' => [ 'headers' => [ 'referer' => '*.[URL].com/*' ] ] ]);Debes tener en cuenta que este tipo de solicitudes se pueden enviar desde cualquier computadora (si tienes la clave) ya que no estás restringiendo el dominio donde se realiza la solicitud, solo verificando quién es el remitente (y puedes configurarlo). a mano). Además, los clientes de API que se ejecutan en un navegador web exponen sus claves de API públicamente ; por eso te recomiendo que uses cuentas de servicio en su lugar. Para más información: añadir restricciones de aplicación .
Con respecto a la referencia HTTP , este es básicamente un campo de encabezado que, básicamente, los navegadores web colocan para que la página web sepa de dónde viene el usuario. Por ejemplo, si hace clic en el enlace anterior ( referencia HTTP ), su campo de referer será esta página.
En resumen, dado que puede colocar cualquier referer en el encabezado de una solicitud, esto es bastante similar a no tener ningún tipo de restricción. De hecho, se recomienda utilizar cuentas de servicio . Para resolver este problema fácilmente, agregue el referer manualmente en los encabezados como se expone en el código anterior.