Búsqueda de sitios web

javascript - Cómo obtener un token de autenticación para la API de Traducción de Google Cloud dentro del navegador (extensión de chrome)


Estoy intentando crear una extensión de Chrome que use la API de Traducción de Google Cloud. Seguí un montón de instrucciones en muchas páginas diferentes en la documentación de Google Translate y para desarrollar extensiones de Chrome, pero todavía no puedo averiguar cómo usar realmente la API desde dentro de un navegador.

Lo más lejos que he llegado fue siguiendo parte de la guía de inicio rápido donde se crea una cuenta de servicio, se obtiene un archivo de clave de cuenta de servicio (descargado como un archivo .json), se instala e inicializa el SDK de Google, se establece la variable de entorno GOOGLE_APPLICATION_CREDENTIALS con la ruta del archivo de clave JSON de la cuenta de servicio, y luego se realiza una solicitud curl usando gcloud auth application-default print-access-token para obtener un token de acceso que se ingresa como parte del encabezado de la solicitud: "Authorization: Bearer (token aquí)". Se obtuvo una traducción con éxito de esa manera.

Pero dentro del entorno de una extensión no se pueden ejecutar comandos como gcloud, así que eso no funciona. Pude obtener manualmente un token de acceso usando el comando gcloud, y luego pegarlo en mi código JavaScript como parte del encabezado de la solicitud (por ejemplo, xmlHttpRequest.setRequestHeader('Authorization', 'Bearer ya29.c.Elr6BRuTfOtherRandomLetters');). Pero ese token de acceso caduca después de 60 minutos, así que eso no funciona de manera sostenible.

También intenté usar el método identity.getAuthToken (después de actualizar cosas en manifest.json como dice la documentación), pero eso no funcionó. Usar el ID de cliente de mi cuenta de servicio como client_id bajo oauth2 en manifest.json resultó en un error de "ID de cliente inválido" de identity.getAuthToken. Por otro lado, generar un ID de cliente OAuth2 desde Google Console, y usar myoauth2clientid.apps.googleusercontent.com como el client_id bajo oauth2 y ["https://www.googleapis.com/auth/cloud-translation", "https://www.googleapis.com/auth/cloud-platform"] como los scopes bajo oauth2 resultó en un error de "OAuth2 no concedido o revocado" de identity.getAuthToken.

Generar una clave de API desde la página de la Consola de Google y usarla directamente como el parámetro key de mi consulta de traducción, ni siquiera funcionó: recibí un error que decía "La solicitud no tiene una clave de API válida."

Realmente estoy perdido aquí. Cualquier ayuda sería excelente.

Respuesta #1

Yo (primer vez publicante) también seguí los mismos pasos que tú, pero con la ayuda de la respuesta de @magicnumber llegué a una solución para traducir texto (de cualquier idioma al inglés) en mi extensión de Chrome usando una clave API en lugar de un archivo de clave de cuenta de servicio.

Primero crea una función de traducción (aquí usé el patrón Async -> Await):

 async function translate(strSourceText,strApiKey)
  {
    var url = `https://translation.googleapis.com/language/translate/v2?key=${strApiKey}`
    let response = await fetch(url, {
      method: 'POST',
      headers : { 
        'Content-Type': 'application/json',
       },
       body: JSON.stringify({
         target: "en",
         format: "text",
         q: strSourceText
       }),
    }); 
    let data = await response.json()
    return data;
  }

Luego llama a la función asíncrona que devolverá una promesa, por ejemplo:

query="כלב" //Hebrew word for dog 🐶

translate(query,  "YOURVALIDAPIKEYGOESHERE")
  .then(response => console.log(response.data))
  .catch(reason => console.log(reason.message));

La respuesta de la API de traducción de Google debería verse así:

{
  "data": {
    "translations": [
      {
        "translatedText": "Dog",
        "detectedSourceLanguage": "iw"
      }
    ]
  }
}

Por último, para evitar violar la Política de Seguridad de Contenidos, en mi caso, tuve que agregar el dominio de la API de traducción a mi clave de permisos en el archivo manifest.json de mi extensión:

"permissions": ["https://translation.googleapis.com/language/translate/v2/*"],

Respuesta #2

Pasé por los mismos pasos que tú y tampoco puedo depender de gcloud para la autenticación.

Lo que me hizo superar el error "La solicitud no tiene una clave de API válida" fue usar la sintaxis de consulta descrita aquí https://codelabs.developers.google.com/codelabs/cloud-translation-intro/index.html#5

En mi caso usé:

curl -s -X POST -H "Content-Type: application/json" \
    --data "{
  'q': 'The Great Pyramid of Giza (also known as the Pyramid of Khufu or the
        Pyramid of Cheops) is the oldest and largest of the three pyramids in
        the Giza pyramid complex.',
  'source': 'en',
  'target': 'es',
  'format': 'text'
}" "https://translation.googleapis.com/language/translate/v2?key=YOURVALIDAPIKEYHERE"