En este tutorial se explica cómo crear un servicio de votación que consta de lo siguiente:
Un cliente basado en navegador que:
- Usa Identity Platform para obtener un token de ID.
- Permite a los usuarios votar por su animal doméstico favorito.
- Añade ese token de ID a una solicitud al servidor de Cloud Run que procesa el voto.
Un servidor de Cloud Run que:
- Comprueba que el usuario final se ha autenticado correctamente proporcionando un token de ID válido.
- Procesa el voto del usuario final.
- Envía el voto a Cloud SQL para almacenarlo usando sus propias credenciales.
Una base de datos de PostgreSQL que almacena los votos.
Para simplificar las cosas, en este tutorial se usa Google como proveedor: los usuarios deben autenticarse con una cuenta de Google para obtener su token de ID. Sin embargo, puedes usar otros proveedores o métodos de autenticación para iniciar la sesión de los usuarios.
Este servicio minimiza los riesgos de seguridad mediante Secret Manager para proteger los datos sensibles que se usan para conectarse a la instancia de Cloud SQL. También usa una identidad de servicio con el mínimo de privilegios para proteger el acceso a la base de datos.
Configurar los valores predeterminados de gcloud
Para configurar gcloud con los valores predeterminados de tu servicio de Cloud Run, sigue estos pasos:
Configura tu proyecto predeterminado:
gcloud config set project PROJECT_ID
Sustituye PROJECT_ID por el nombre del proyecto que has creado para este tutorial.
Configura gcloud para la región que hayas elegido:
gcloud config set run/region REGION
Sustituye REGION por la región de Cloud Run compatible que quieras.
Ubicaciones de Cloud Run
Cloud Run es regional, lo que significa que la infraestructura que ejecuta tus servicios de Cloud Run se encuentra en una región específica y Google la gestiona para que esté disponible de forma redundante en todas las zonas de esa región.
Cumplir tus requisitos de latencia, disponibilidad o durabilidad son factores primordiales para seleccionar la región en la que se ejecutan tus servicios de Cloud Run.
Por lo general, puedes seleccionar la región más cercana a tus usuarios, pero debes tener en cuenta la ubicación de los otros Google Cloudproductos que utiliza tu servicio de Cloud Run.
Usar Google Cloud productos juntos en varias ubicaciones puede afectar a la latencia y al coste de tu servicio.
Cloud Run está disponible en las siguientes regiones:
Con sujeción a los precios del nivel 1
asia-east1
(Taiwán)asia-northeast1
(Tokio)asia-northeast2
(Osaka)asia-south1
(Bombay, la India)europe-north1
(Finlandia)CO2 bajo
europe-north2
(Estocolmo)CO2 bajo
europe-southwest1
(Madrid)CO2 bajo
europe-west1
(Bélgica)CO2 bajo
europe-west4
(Países Bajos)CO2 bajo
europe-west8
(Milán)europe-west9
(París)CO2 bajo
me-west1
(Tel Aviv)northamerica-south1
(México)us-central1
(Iowa)CO2 bajo
us-east1
(Carolina del Sur)us-east4
(Norte de Virginia)us-east5
(Columbus)us-south1
(Dallas)CO2 bajo
us-west1
(Oregón)CO2 bajo
Con sujeción a los precios del nivel 2
africa-south1
(Johannesburgo)asia-east2
(Hong Kong)asia-northeast3
(Seúl, Corea del Sur)asia-southeast1
(Singapur)asia-southeast2
(Yakarta)asia-south2
(Delhi, la India)australia-southeast1
(Sídney)australia-southeast2
(Melbourne)europe-central2
Varsovia (Polonia)europe-west10
(Berlín)europe-west12
(Turín)europe-west2
(Londres, Reino Unido)CO2 bajo
europe-west3
(Fráncfort, Alemania)europe-west6
(Zúrich, Suiza)Bajas emisiones de CO2
me-central1
(Doha)me-central2
(Dammam)northamerica-northeast1
(Montreal)CO2 bajo
northamerica-northeast2
(Toronto)CO2 bajo
southamerica-east1
(São Paulo, Brasil)CO2 bajo
southamerica-west1
(Santiago, Chile)CO2 bajo
us-west2
(Los Ángeles)us-west3
(Salt Lake City)us-west4
(Las Vegas)
Si ya has creado un servicio de Cloud Run, puedes ver la región en el panel de control de Cloud Run de la Google Cloud consola.
Obtener el código de ejemplo
Para obtener el código de muestra que vas a usar, sigue estos pasos:
Clona el repositorio de aplicaciones de muestra en la máquina local:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Cambia al directorio que contiene el código de ejemplo de Cloud Run:
Node.js
cd nodejs-docs-samples/run/idp-sql/
Python
cd python-docs-samples/run/idp-sql/
Java
cd java-docs-samples/run/idp-sql/
Visualizar la arquitectura

Un usuario final hace la primera solicitud al servidor de Cloud Run.
El cliente se carga en el navegador.
El usuario proporciona las credenciales de inicio de sesión a través del cuadro de diálogo de inicio de sesión de Google de Identity Platform. Se muestra una alerta para dar la bienvenida al usuario que ha iniciado sesión.
El control se redirige de nuevo al servidor. El usuario final vota mediante el cliente, que obtiene un token de ID de Identity Platform y lo añade a la cabecera de la solicitud de voto.
Cuando el servidor recibe la solicitud, verifica el token de ID de Identity Platform y confirma que el usuario final está autenticado correctamente. A continuación, el servidor envía el voto a Cloud SQL con sus propias credenciales.
Información sobre el código principal
El ejemplo se implementa como cliente y servidor, tal como se describe a continuación.
Integración con Identity Platform: código del lado del cliente
En este ejemplo se usan los SDKs de Firebase para integrarse con Identity Platform con el fin de iniciar sesión y gestionar usuarios. Para conectarse a Identity Platform, el JavaScript del lado del cliente contiene la referencia a las credenciales del proyecto como un objeto de configuración e importa los SDKs de JavaScript de Firebase necesarios:
El SDK de JavaScript de Firebase gestiona el flujo de inicio de sesión pidiendo al usuario final que inicie sesión en su cuenta de Google a través de una ventana emergente. A continuación, se les redirige de nuevo al servicio.
Cuando un usuario inicia sesión correctamente, el cliente usa métodos de Firebase para generar un token de ID. El cliente añade el token de ID a la cabecera Authorization
de su solicitud al servidor.
Integración con Identity Platform: código del lado del servidor
El servidor usa el SDK de administrador de Firebase
para verificar el token de ID de usuario enviado desde el cliente. Si el token de ID proporcionado tiene el formato correcto, no ha caducado y está firmado correctamente, el método devuelve el token de ID decodificado. El servidor extrae el uid
de Identity Platform de ese usuario.
Node.js
Python
Java
Conectar el servidor a Cloud SQL
El servidor se conecta al socket de dominio Unix de la instancia de Cloud SQL con el formato /cloudsql/CLOUD_SQL_CONNECTION_NAME
.
Node.js
Python
Java
Usa la integración Spring Cloud Google Cloud PostgreSQL starter para interactuar con tus bases de datos de PostgreSQL en Cloud SQL mediante bibliotecas Spring JDBC. Configura Cloud SQL para MySQL para que configure automáticamente un beanDataSource
que, junto con Spring JDBC, proporciona un bean de objeto JdbcTemplate
que permite realizar operaciones como consultar y modificar una base de datos.
Gestionar la configuración sensible con Secret Manager
Secret Manager proporciona un almacenamiento centralizado y seguro de datos sensibles, como la configuración de Cloud SQL. El servidor inserta las credenciales de Cloud SQL desde Secret Manager en el tiempo de ejecución mediante una variable de entorno. Consulta más información sobre cómo usar secretos con Cloud Run.
Node.js
Python
Java
Configurar Identity Platform
Identity Platform requiere una configuración manual en la Google Cloud consola.
En la Google Cloud consola, habilita la API Identity Platform:
Configura tu proyecto:
En una ventana nueva, ve a la página Plataforma de autenticación de Google > Vista general.
Haz clic en Empezar y sigue los pasos para configurar el proyecto.
En el cuadro de diálogo Información de la aplicación:
- Indica el nombre de la aplicación.
- Selecciona uno de los correos de asistencia que se muestran.
En el cuadro de diálogo Audiencia, seleccione Externa.
En el cuadro de diálogo Información de contacto, introduce un correo de contacto.
Acepta la política de datos de usuario y haz clic en Crear.
Crea y obtén tu ID de cliente y secreto de OAuth:
En la Google Cloud consola, ve a la página APIs y servicios > Credenciales.
En la parte superior de la página, haz clic en Crear credenciales y selecciona
OAuth client ID
.En Tipo de aplicación, selecciona Aplicación web y escribe el nombre.
Primero, haz clic en Crear.
Los valores de
client_id
yclient_secret
se usarán en el siguiente paso.
Configura Google como proveedor:
En la Google Cloud consola, ve a la página Proveedores de identidades.
Haz clic en Add A Provider (Añadir proveedor).
Selecciona Google en la lista.
En los ajustes de configuración del SDK web, introduce los valores
client_id
yclient_secret
del paso anterior.En Configura tu aplicación, haz clic en Detalles de la configuración.
Copia la configuración en tu aplicación:
- Copia los valores de
apiKey
yauthDomain
en elstatic/config.js
de la muestra para inicializar el SDK de cliente de Identity Platform.
- Copia los valores de
Desplegar el servicio
Sigue los pasos para completar el aprovisionamiento y la implementación de la infraestructura:
Crea una instancia de Cloud SQL con una base de datos PostgreSQL mediante la consola o la CLI:
gcloud sql instances create CLOUD_SQL_INSTANCE_NAME \ --database-version=POSTGRES_16 \ --region=CLOUD_SQL_REGION \ --cpu=2 \ --memory=7680MB \ --root-password=DB_PASSWORD
Añade los valores de tus credenciales de Cloud SQL a
postgres-secrets.json
:Node.js
Python
Java
Crea un secreto versionado con la consola o la CLI:
gcloud secrets create idp-sql-secrets \ --replication-policy="automatic" \ --data-file=postgres-secrets.json
Crea una cuenta de servicio para el servidor con la consola o la CLI:
gcloud iam service-accounts create idp-sql-identity
Asigna roles para acceder a Secret Manager y Cloud SQL con la consola o la CLI:
Permite que la cuenta de servicio asociada al servidor acceda al secreto creado:
gcloud secrets add-iam-policy-binding idp-sql-secrets \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/secretmanager.secretAccessor
Permite que la cuenta de servicio asociada al servidor acceda a Cloud SQL:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --role roles/cloudsql.client
Crea un Artifact Registry:
gcloud artifacts repositories create REPOSITORY \ --repository-format docker \ --location REGION
REPOSITORY
es el nombre del repositorio. Los nombres de los repositorios deben ser únicos en cada ubicación de repositorio de un proyecto.
Crea la imagen de contenedor con Cloud Build:
Node.js
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Python
gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Java
En este ejemplo se usa Jib para crear imágenes de Docker con herramientas comunes de Java. Jib optimiza las compilaciones de contenedores sin necesidad de usar un Dockerfile ni de tener Docker instalado. Más información sobre cómo crear contenedores Java con Jib
Usa el asistente de credenciales de gcloud para autorizar a Docker a enviar contenido a tu Artifact Registry.
gcloud auth configure-docker
Usa el complemento Jib Maven para compilar y enviar el contenedor a Artifact Registry.
mvn compile jib:build -Dimage=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql
Despliega la imagen de contenedor en Cloud Run mediante la consola o la CLI. Ten en cuenta que el servidor se implementa para permitir el acceso sin autenticación. De esta forma, el usuario puede cargar el cliente e iniciar el proceso. El servidor verifica manualmente el token de ID añadido a la solicitud de voto y autentica al usuario final.
gcloud run deploy idp-sql \ --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/idp-sql \ --allow-unauthenticated \ --service-account idp-sql-identity@PROJECT_ID.iam.gserviceaccount.com \ --add-cloudsql-instances PROJECT_ID:REGION:CLOUD_SQL_INSTANCE_NAME \ --update-secrets CLOUD_SQL_CREDENTIALS_SECRET=idp-sql-secrets:latest
También debes tener en cuenta las marcas
--service-account
,--add-cloudsql-instances
y--update-secrets
, que especifican la identidad de servicio, la conexión de la instancia de Cloud SQL y el nombre del secreto con la versión como variable de entorno, respectivamente.
Retoques finales
Identity Platform requiere que autorices la URL del servicio de Cloud Run como redirección permitida después de que el usuario haya iniciado sesión:
Para editar el proveedor de Google, haz clic en el icono del lápiz de la página Proveedores de identidades.
En el panel de la derecha, en Dominios autorizados, haz clic en Añadir dominio e introduce la URL del servicio de Cloud Run.
Puedes encontrar la URL del servicio en los registros después de la compilación o la implementación, o bien en cualquier momento mediante el siguiente comando:
gcloud run services describe idp-sql --format 'value(status.url)'
Ve a la página APIs y servicios > Credenciales.
Haz clic en el icono del lápiz situado junto a tu ID de cliente de OAuth para editarlo y, a continuación, en el botón
Authorized redirect URIs click the
Añadir URI.Copia y pega la siguiente URL en el campo y haz clic en el botón Guardar situado en la parte inferior de la página.
https://PROJECT_ID.firebaseapp.com/__/auth/handler
Probar la función
Para probar el servicio completo, sigue estos pasos:
En tu navegador, ve a la URL que se ha proporcionado en el paso de implementación anterior.
Haz clic en el botón Iniciar sesión con Google y sigue el proceso de autenticación.
¡Vota!
Debería tener este aspecto:
Si decides seguir desarrollando estos servicios, recuerda que tienen acceso restringido a la gestión de identidades y accesos (IAM) al resto de Google Cloud y que tendrás que asignarles roles de IAM adicionales para acceder a muchos otros servicios.