es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La autenticación de BigQuery con una cuenta de servicio desde un texto o cadena, y no desde una ruta de archivo.

Estoy utilizando este cliente de BigQuery de Node.js:
https://cloud.google.com/bigquery/docs/reference/libraries#client-libraries-usage-nodejs

Tengo el archivo json de la cuenta de servicio en formato de cadena de texto, quiero evitar escribirlo en un archivo temporal por razones de seguridad. ¿Existe alguna opción para hacer nuevo BigQuery() y proporcionar la cuenta de servicio como cadena de texto en lugar de como archivo? No he encontrado esta opción en ningún lugar, en todos los ejemplos es necesaria la ruta del archivo o exportar la variable GOOGLE_APPLICATION_CREDENTIALS.

Gracias.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Según la documentación de la biblioteca cliente de Node.js de Google Cloud BigQuery, no es posible proporcionar directamente la cuenta de servicio como una cadena al constructor new BigQuery(). El constructor requiere la ruta al archivo JSON de la cuenta de servicio o la ubicación del archivo de credenciales de la cuenta de servicio predeterminada, que se establece utilizando la variable de entorno GOOGLE_APPLICATION_CREDENTIALS.

    Sin embargo, hay soluciones alternativas para evitar escribir el JSON de la cuenta de servicio en un archivo temporal. Una opción es establecer la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la cadena JSON de la cuenta de servicio antes de instanciar el cliente BigQuery. Así es cómo se puede hacer en Node.js:

    const {BigQuery} = require('@google-cloud/bigquery');
    const {google} = require('googleapis');
    
    const saJsonStr = '{ "type": "service_account", ... }'; // Reemplazar con la cadena JSON de su cuenta de servicio
    
    // Establecer la variable de entorno GOOGLE_APPLICATION_CREDENTIALS con la cadena JSON de la cuenta de servicio
    process.env.GOOGLE_APPLICATION_CREDENTIALS = 'data:application/json;base64,' + Buffer.from(saJsonStr).toString('base64');
    
    // Crear un cliente BigQuery
    const bigquery = new BigQuery();
    

    Esto convierte la cadena JSON de la cuenta de servicio al formato base64 y la establece como el valor de la variable de entorno GOOGLE_APPLICATION_CREDENTIALS utilizando la API process.env. El cliente BigQuery luego usa esta variable de entorno para autenticarse con Google Cloud.

    Otra opción es utilizar la biblioteca google-auth-library para autenticarse con Google Cloud utilizando la cadena JSON de la cuenta de servicio directamente. Aquí hay un ejemplo de cómo se puede hacer:

    const {BigQuery} = require('@google-cloud/bigquery');
    const {google} = require('googleapis');
    const {JWT} = require('google-auth-library');
    
    const saJsonStr = '{ "type": "service_account", ... }'; // Reemplazar con la cadena JSON de su cuenta de servicio
    
    // Crear un cliente JWT utilizando la cadena JSON de la cuenta de servicio
    const jwtClient = new JWT({
      email: JSON.parse(saJsonStr).client_email,
      key: JSON.parse(saJsonStr).private_key,
      scopes: ['https://www.googleapis.com/auth/bigquery'],
    });
    
    // Obtener un token de acceso
    const {access_token} = await jwtClient.authorize();
    
    // Crear un cliente BigQuery utilizando el token de acceso
    const bigquery = new BigQuery({
      projectId: JSON.parse(saJsonStr).project_id,
      credentials: {access_token},
    });
    

    Esto utiliza el cliente JWT de la biblioteca google-auth-library para autenticarse con Google Cloud utilizando la cadena JSON de la cuenta de servicio directamente. El cliente obtiene un token de acceso que puede ser utilizado para autenticar el cliente BigQuery. Note que este enfoque requiere más código y puede no ser tan conveniente como establecer la variable de entorno GOOGLE_APPLICATION_CREDENTIALS.

Comments are closed.