En este tutorial se explica cómo obtener, verificar y almacenar credenciales de terceros mediante Identity Platform, el entorno estándar de App Engine y Datastore.
En este documento se explica cómo crear una aplicación sencilla para tomar notas llamada Firenotes, que almacena las notas de los usuarios en sus cuadernos personales. Los cuadernos se almacenan por usuario y se identifican mediante el ID único de Identity Platform de cada usuario. La aplicación tiene los siguientes componentes:
El frontend configura la interfaz de usuario de inicio de sesión y obtiene el ID de Identity Platform. También gestiona los cambios de estado de la autenticación y permite que los usuarios vean sus notas.
FirebaseUI es una solución directa de código abierto que simplifica las tareas de autenticación y de interfaz de usuario. El SDK gestiona el inicio de sesión de los usuarios, la vinculación de varios proveedores a una cuenta, la recuperación de contraseñas y más. Implementa prácticas recomendadas de autenticación para ofrecer una experiencia de inicio de sesión fluida y segura.
El backend verifica el estado de autenticación del usuario y devuelve la información del perfil del usuario, así como sus notas.
La aplicación almacena las credenciales de usuario en Datastore mediante la biblioteca de cliente NDB, pero puedes almacenar las credenciales en la base de datos que quieras.
Firenotes se basa en el framework de aplicaciones web Flask. La aplicación de muestra usa Flask por su simplicidad y facilidad de uso, pero los conceptos y tecnologías explorados son aplicables independientemente del framework que utilices.
Clonar la aplicación de muestra
Para descargar la muestra en tu máquina local, sigue estos pasos:
Clona el repositorio de la aplicación de muestra en tu máquina local:
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
También puedes descargar el ejemplo como un archivo ZIP y extraerlo.
Navega al directorio que contiene el código de muestra:
cd python-docs-samples/appengine/standard/firebase/firenotes
Añadir la interfaz de usuario
Para configurar FirebaseUI para Identity Platform y habilitar proveedores de identidades, sigue estos pasos:
Añade Identity Platform a tu aplicación siguiendo estos pasos:
- Ve a la Google Cloud consola.
Ve a la Google Cloud consola. - Selecciona el Google Cloud proyecto que quieras usar:
- Si ya tienes un proyecto, selecciónalo en la lista desplegable Seleccionar organización, que aparece en la parte superior de la página.
- Si no tienes ningún Google Cloud proyecto, crea uno en la Google Cloud consola.
- Ve a la página Mercado de Identity Platform de la Google Cloud consola.
Ve a la página de Google Identity Platform Marketplace - En la página de Identity Platform Marketplace, haz clic en Habilitar Identity de cliente.
- Ve a la página Usuarios de Customer Identity en la Google Cloud consola.
Ir a la página Usuarios - En la parte superior derecha, haz clic en detalles de configuración de la aplicación.
Copia los detalles de configuración de la aplicación en tu aplicación web.
- Ve a la Google Cloud consola.
Edita el archivo
backend/app.yaml
para añadirGOOGLE_CLOUD_PROJECT : 'PROJECT_ID'
en la secciónenv_variables
:En el archivo
frontend/main.js
, configura el widget de inicio de sesión de FirebaseUI seleccionando los proveedores que quieras ofrecer a tus usuarios.En la Google Cloud consola, habilita los proveedores que hayas elegido conservar:
- Ve a la página Proveedores de identidad de cliente de la Google Cloud consola.
Ir a la página Proveedores - Haz clic en Add A Provider (Añadir proveedor).
- En la lista desplegable Seleccionar un proveedor, elige los proveedores que quieras usar.
- Junto a Habilitado, haz clic en el botón para habilitar el proveedor.
- En el caso de los proveedores de identidades externos, introduzca el ID y el secreto del proveedor en el sitio para desarrolladores del proveedor. En la documentación de Firebase se ofrecen instrucciones específicas en las secciones "Antes de empezar" de las guías de Facebook, Twitter y GitHub.
- En el caso de las integraciones de SAML y OIDC, consulta la configuración de tu proveedor de identidades.
- Ve a la página Proveedores de identidad de cliente de la Google Cloud consola.
Añada su dominio a la lista de dominios autorizados en Identity Platform:
- Ve a la página Configuración de Customer Identity en la Google Cloud consola.
Ve a la página Configuración - En Dominios autorizados, haz clic en Añadir dominio.
Introduce el dominio de tu aplicación con el siguiente formato:
[PROJECT_ID].appspot.com
No incluyas
http://
antes del nombre de dominio.
- Ve a la página Configuración de Customer Identity en la Google Cloud consola.
Instalar dependencias
Ve al directorio
backend
y completa la configuración de la aplicación:cd backend/
Instala las dependencias en un directorio
lib
de tu proyecto:pip install -t lib -r requirements.txt
En
appengine_config.py
, el métodovendor.add()
registra las bibliotecas en el directoriolib
.
Ejecutar la aplicación de forma local
Para ejecutar la aplicación de forma local, usa el servidor de desarrollo local de App Engine:
Añada la siguiente URL como
backendHostURL
enmain.js
:http://localhost:8081
Ve al directorio raíz de la aplicación. A continuación, inicia el servidor de desarrollo:
dev_appserver.py frontend/app.yaml backend/app.yaml
Visita http://localhost:8080/ en un navegador web.
Autenticar usuarios en el servidor
Ahora que has configurado un proyecto e inicializado una aplicación para el desarrollo, puedes consultar el código para saber cómo obtener y verificar tokens de ID de Identity Platform en el servidor.
Obtener un token de ID de Identity Platform
El primer paso de la autenticación del lado del servidor es obtener un token de acceso para verificarlo. Las solicitudes de autenticación se gestionan con el onAuthStateChanged()
listener de Identity Platform:
Cuando un usuario inicia sesión, el método getToken()
de Identity Platform en la devolución de llamada devuelve un token de ID de Identity Platform en forma de JSON Web Token (JWT).
Verificar tokens en el servidor
Cuando un usuario inicia sesión, el servicio de frontend obtiene las notas que haya en el cuaderno del usuario mediante una solicitud AJAX GET
. Para ello, se necesita autorización para acceder a los datos del usuario, por lo que el JWT se envía en el encabezado Authorization
de la solicitud mediante el esquema Bearer
:
Para que el cliente pueda acceder a los datos del servidor, este debe verificar que el token esté firmado por Identity Platform. Puedes verificar este token con la biblioteca de autenticación de Google para Python.
Usa la función verify_firebase_token
de la biblioteca de autenticación para verificar el token de portador y extraer las reclamaciones:
Cada proveedor de identidades envía un conjunto de reclamaciones diferente, pero todos tienen al menos una reclamación sub
con un ID de usuario único y una reclamación que proporciona información de perfil, como name
o email
, que puedes usar para personalizar la experiencia de usuario en tu aplicación.
Gestionar datos de usuario en Datastore
Después de autenticar a un usuario, debes almacenar sus datos para que se conserven una vez que haya finalizado la sesión en la que ha iniciado sesión. En las siguientes secciones se explica cómo almacenar una nota como una entidad de Datastore y segregar las entidades por ID de usuario.
Crear entidades para almacenar datos de usuario
Para crear una entidad en Datastore, declara una clase de modelo NDB con determinadas propiedades, como números enteros o cadenas. Los índices de Datastore indexan las entidades por tipo. En el caso de Firenotes, el tipo de cada entidad es Note
.
Para hacer consultas, cada Note
se almacena con un nombre de clave, que es el ID de usuario obtenido de la reclamación sub
en la sección anterior.
En el siguiente código se muestra cómo definir las propiedades de una entidad, tanto con el método del constructor de la clase de modelo cuando se crea la entidad como mediante la asignación de propiedades individuales después de la creación:
Para escribir el Note
recién creado en Datastore, llama al método put()
del objeto note
.
Obtener datos de usuario
Para recuperar los datos de usuario asociados a un ID de usuario concreto, usa el método NDB
query()
para buscar en la base de datos las notas del mismo grupo de entidades.
Las entidades del mismo grupo o ruta de ancestros comparten un nombre de clave común, que en este caso es el ID de usuario.
Después, puedes obtener los datos de la consulta y mostrar las notas en el cliente:
Desplegar una aplicación
Has integrado correctamente Identity Platform con tu aplicación de App Engine. Para ver tu aplicación en un entorno de producción activo, sigue estos pasos:
- Cambia la URL del host de backend en
main.js
ahttps://backend-dot-[PROJECT_ID].appspot.com
. Sustituye[PROJECT_ID]
por el ID de tu proyecto. Despliega la aplicación mediante la interfaz de línea de comandos del SDK de Google Cloud:
gcloud app deploy backend/index.yaml frontend/app.yaml backend/app.yaml
Consulta la aplicación publicada en
https://[PROJECT_ID].appspot.com
.