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:
- Uso de un enlace directo de descarga GCS con un usuario READER acl.
- 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.