que node google espaƱol javascript http google-cloud-storage google-api-client

javascript - node - google cloud storage stream



Cargar desde el navegador del cliente a Google Cloud Storage usando JavaScript (1)

Estoy usando Google Cloud Storage. Para subir al almacenamiento en la nube he visto diferentes métodos. El método más común que encuentro es que el archivo se envía al servidor y, desde allí, se envía al almacenamiento de Google Cloud.

Quiero mover el archivo directamente desde el navegador web del usuario a Google Cloud Storage. No puedo encontrar ningún tutorial relacionado con esto. He leído el SDK del cliente API de Google para JavaScript.

Al pasar por la referencia de la API de Google, se establece que los archivos se pueden transferir mediante una solicitud HTTP. Pero estoy confundido acerca de cómo hacerlo usando la biblioteca cliente API para JavaScript.

La gente aquí necesitaría compartir algún código. Pero no he escrito ningún código, no he podido encontrar un método para hacer el trabajo.


EDIT 1: Código de ejemplo no probado

Así que me interesé mucho en esto, y tuve unos minutos para lanzar un código juntos. Decidí crear un pequeño servidor Express para obtener el token de acceso, pero igual hago la carga desde el cliente. fetch para hacer la carga en lugar de la biblioteca del cliente.

No tengo una cuenta en la nube de Google y, por lo tanto, no he probado esto, por lo que no puedo confirmar que funcione, pero no puedo ver por qué no debería. El código está en mi GitHub aquí .

Léalo y realice los cambios necesarios antes de intentar ejecutarlo. En particular, debe especificar la ubicación del archivo de clave privada, así como asegurarse de que esté allí, y debe establecer el nombre del depósito en index.html .

Fin de edición 1

Descargo de responsabilidad: solo he usado la biblioteca de clientes de Google Node.js para enviar correos electrónicos, pero creo que tengo un conocimiento básico de las API de Google.

Para utilizar cualquier servicio de Google, necesitamos tokens de acceso para verificar nuestra identidad; Sin embargo, dado que estamos buscando permitir que cualquier usuario suba a nuestro propio depósito de almacenamiento en la nube, no necesitamos pasar por el proceso estándar de OAuth.

Google proporciona lo que llaman una cuenta de servicio, que es una cuenta que utilizamos para identificar instancias de nuestras propias aplicaciones que acceden a nuestros propios recursos. Mientras que, en un proceso estándar de OAuth, deberíamos identificar nuestra aplicación para el servicio, contar con el consentimiento del usuario para usar nuestra aplicación (y, por lo tanto, otorgarnos su permiso), obtener un token de acceso para ese usuario específico y luego realizar solicitudes al servicio ; con una cuenta de servicio, podemos omitir el proceso de consentimiento del usuario, ya que, en cierto sentido, somos nuestro propio usuario. El uso de una cuenta de servicio nos permite simplemente usar nuestras credenciales generadas desde la consola de la API de Google para generar un JWT (token web JSON), que luego usamos para obtener un token de acceso, que utilizamos para realizar solicitudes al servicio de almacenamiento en la nube. Consulte here la guía de Google sobre este proceso.

En el pasado, he usado paquetes como este para generar JWT, pero no pude encontrar ninguna biblioteca cliente para codificar JWT; Sobre todo porque se generan casi exclusivamente en servidores. Sin embargo, encontré este tutorial que, a simple vista, parece suficiente para escribir nuestro propio algoritmo de codificación.

Me gustaría señalar aquí que abrir una aplicación para permitirle al público acceso gratuito a sus recursos de Google puede resultar perjudicial para usted o su organización en el futuro, como estoy seguro de que ha considerado. Este es un riesgo de seguridad importante, por lo que todos los tutoriales que has visto hasta ahora han implementado dos subidas consecutivas.

Si fuera yo, al menos haría la primera parte del proceso de autenticación en mi servidor: cuando el usuario esté listo para cargar, enviaría una solicitud a mi servidor para generar el token de acceso para los servicios de Google usando las credenciales de mi cuenta de servicio y luego enviaría a cada usuario un nuevo token de acceso que mi servidor generó. De esta manera, tengo una capa de seguridad adicional entre el mundo exterior y mi cuenta de Google, ya que la carga de la autenticación recae en mi servidor, y solo la carga la realiza el cliente.

De todos modos, una vez que tengamos el token de acceso, podemos utilizar la función CORS que Google proporciona para subir archivos a nuestro grupo. Esta función nos permite usar solicitudes XHR 2 estándar para usar los servicios de Google, y está esencialmente diseñada para ser utilizada en lugar de la biblioteca del cliente de JavaScript . Preferiría usar la función CORS sobre la biblioteca cliente solo porque creo que es un poco más sencillo y un poco más flexible en su implementación. (No he probado esto, pero creo que fetch funcionaría aquí tan bien como XHR 2 ).

Desde aquí, deberíamos obtener el archivo del usuario, así como la información que deseamos de él con respecto al archivo (leer: nombre del archivo), y luego realizar una solicitud POST a https://www.googleapis.com/upload/storage/v1/b/<BUCKET_NAME_HERE>/o (reemplazando con el nombre de su grupo, por supuesto) con el token de acceso agregado a la URL según la sección Realización de solicitudes autenticadas de la página de características de CORS y cualquier otro parámetro en la cadena de cuerpo / consulta que desea incluir, según la documentación de la API de almacenamiento en la nube al insertar un objeto . Una lista de API para el servicio de almacenamiento en la nube se puede encontrar here como referencia.

Como nunca he hecho esto antes, y no tengo la capacidad de probar esto, no tengo ningún código de ejemplo para incluir en mi respuesta, pero espero que mi publicación sea lo suficientemente clara como para armar el código Debería ser relativamente sencillo desde aquí.

Solo para aclarar las cosas, siempre he encontrado que OAuth es bastante confuso, y generalmente he evitado jugar con él debido a mi miedo a sus incógnitas. Sin embargo, creo que finalmente lo dominé, especialmente después de esta publicación, así que no puedo esperar para obtener una hora libre para jugar con ella.

Por favor, hágame saber si algo de lo que dije no es claro o coherente.