standard pricing google flexible engine docs deploy app google-app-engine authentication google-cloud-storage acl blobstorage

google app engine - pricing - Almacenamiento en la nube y estrategia de descarga segura en el motor de la aplicaciĆ³n. GCS acl o blobstore



google app engine python standard (1)

Mi aplicación appengine crea archivos de almacenamiento en la nube. Los archivos serán descargados por un tercero. Los archivos contienen información médica personal .

Cuál sería la forma preferida de descarga:

  1. Uso de un enlace directo de descarga GCS con un usuario READER acl.
  2. O usando un controlador de descarga blobstore en una aplicación appengine.

Ambas soluciones requieren que el tercero inicie sesión (inicio de sesión en google). El rendimiento no es un problema. La privacidad y la ocurrencia de errores de seguridad y errores son.

Usar un archivo zip encriptado para descargar es una opción. Esto significa que tengo que almacenar la contraseña en el proyecto. ¿O enviar por correo electrónico una contraseña aleatoria?

Actualizar el código de apéndice que utilicé para crear una URL de descarga firmada

import time import urllib from datetime import datetime, timedelta from google.appengine.api import app_identity import os import base64 API_ACCESS_ENDPOINT = ''https://storage.googleapis.com'' # Use the default bucket in the cloud and not the local SDK one from app_identity default_bucket = ''%s.appspot.com'' % os.environ[''APPLICATION_ID''].split(''~'', 1)[1] google_access_id = app_identity.get_service_account_name() def sign_url(bucket_object, expires_after_seconds=60): """ cloudstorage signed url to download cloudstorage object without login Docs : https://cloud.google.com/storage/docs/access-control?hl=bg#Signed-URLs API : https://cloud.google.com/storage/docs/reference-methods?hl=bg#getobject """ method = ''GET'' gcs_filename = ''/%s/%s'' % (default_bucket, bucket_object) content_md5, content_type = None, None expiration = datetime.utcnow() + timedelta(seconds=expires_after_seconds) expiration = int(time.mktime(expiration.timetuple())) # Generate the string to sign. signature_string = ''/n''.join([ method, content_md5 or '''', content_type or '''', str(expiration), gcs_filename]) _, signature_bytes = app_identity.sign_blob(signature_string) signature = base64.b64encode(signature_bytes) # Set the right query parameters. query_params = {''GoogleAccessId'': google_access_id, ''Expires'': str(expiration), ''Signature'': signature} # Return the download URL. return ''{endpoint}{resource}?{querystring}''.format(endpoint=API_ACCESS_ENDPOINT, resource=gcs_filename, querystring=urllib.urlencode(query_params))


Si un pequeño número de usuarios tiene acceso a todos los archivos en el cubo, entonces la solución # 1 sería suficiente, ya que administrar la ACL no sería demasiado doloroso.

Sin embargo, si tiene muchos usuarios diferentes que requieren diferentes accesos a los diferentes archivos del contenedor, la solución n. ° 1 no es práctica.

También evitaría la solución n. ° 2, ya que pagaría por el ancho de banda de GAE entrante / saliente innecesario.

Quizás una tercera solución a tener en cuenta sería utilizar la autenticación de manejo de App Engine y escribir lógica para determinar qué usuarios tienen acceso a qué archivos. Luego, cuando se solicita la descarga de un archivo, se crean URL firmadas para descargar los datos directamente de GCS. Puede establecer el parámetro de caducidad en un valor que funcione para usted, lo que invalidaría la URL después de un período de tiempo determinado.