En esta parte del tutorial de Bookshelf para Node.js, se muestra cómo crear un flujo de inicio de sesión para los usuarios y cómo usar la información del perfil para ofrecer a los usuarios funciones personalizadas.
Con Google Identity Platform, puedes acceder fácilmente a la información sobre los usuarios y al mismo tiempo garantizar que Google administre sus credenciales de inicio de sesión de forma segura. OAuth 2.0 facilita el flujo de inicio de sesión para todos los usuarios de la aplicación y proporciona a la aplicación acceso a información básica del perfil sobre usuarios autenticados.
Esta página forma parte de un tutorial de varias páginas. Para empezar desde lo básico y consultar las instrucciones de configuración, ve a la aplicación Bookshelf de Node.js.
Crear una ID de cliente de aplicación web
Un ID de cliente de aplicación web permite que la aplicación autorice a los usuarios y acceda a las API de Google en nombre de los usuarios.
-
Ve a la sección de credenciales en la consola de Google Cloud Platform.
-
Haz clic en la pantalla de autorización de OAuth. Introduce
Node.js Bookshelf App
en el nombre del producto. Completa los campos opcionales relevantes. Haz clic en Guardar. -
Haz clic en Crear credenciales > ID de cliente OAuth.
-
En Tipo de aplicación, selecciona Aplicación web.
-
En Nombre, introduce
Node.js Bookshelf Client
. -
En URI de redirección autorizadas, introduce las siguientes URL, una a la vez. Sustituye
[YOUR_PROJECT_ID]
por el ID del proyecto:http://localhost:8080/auth/google/callback
http://[YOUR_PROJECT_ID].appspot.com/auth/google/callback
https://[YOUR_PROJECT_ID].appspot.com/auth/google/callback
http://[YOUR_PROJECT_ID].appspot-preview.com/auth/google/callback
https://[YOUR_PROJECT_ID].appspot-preview.com/auth/google/callback
-
Haz clic en Crear.
-
Copia el ID de cliente y secreto de cliente y guárdalos para usarlos más tarde.
Crear una instancia Memcached
Si quieres almacenar correctamente las sesiones en varias máquinas virtuales de App Engine, se debe almacenar los datos de sesión en ubicaciones a las que puedan acceder todas las instancias de App Engine. Para ello, usaremos una instancia Memcache para almacenar nuestros datos de sesión entre servidores.
Si aún no tienes una instancia Memcached, obtén una gratis en Redis Labs. Si utilizas Redis Labs, la propiedad Endpoint
muestra la URL que apunta a la instancia Memcached.
Establecer configuración
Copia el archivo config.json
de la parte de Cloud Storage de este tutorial al directorio nodejs-getting-started/4-auth
.
Agrega las siguientes líneas al archivo copiado:
"OAUTH2_CLIENT_ID": "[YOUR_OAUTH2_CLIENT_ID]",
"OAUTH2_CLIENT_SECRET": "[YOUR_OAUTH2_CLIENT_SECRET]",
"OAUTH2_CALLBACK": "http://localhost:8080/auth/google/callback",
"MEMCACHE_URL": "[YOUR_MEMCACHE_URL]"
- Sustituye
[YOUR_OAUTH2_CLIENT_ID]
y[YOUR_OAUTH2_CLIENT_SECRET]
por el ID y el secreto de cliente de la aplicación que creaste anteriormente. - Sustituye
[YOUR_MEMCACHE_URL]
por una URL que apunte a la instancia Memcached. Esta URL debe tener el formatohostname:port
.
Instalar dependencias
Instala dependencias en el directorio nodejs-getting-started/4-auth
:
Ejecutar la aplicación en la máquina local
-
Usa
npm
oyarn
para iniciar un servidor web local:-
Con
npm
:npm start
-
Con
yarn
:yarn start
-
-
Introduce la siguiente dirección en el navegador web.
Desplegar la aplicación en el entorno flexible de App Engine
-
Cambia la línea
OAUTH2_CALLBACK
deconfig.json
por la siguiente para habilitar la autenticación online. Sustituye[YOUR_PROJECT_ID]
por el ID del proyecto:"OAUTH2_CALLBACK": "https://[YOUR_PROJECT_ID].appspot.com/auth/google/callback"
-
Despliega la aplicación de muestra:
gcloud app deploy
-
Introduce la siguiente dirección en el navegador web. Sustituye
[YOUR_PROJECT_ID]
por el ID del proyecto:https://[YOUR_PROJECT_ID].appspot.com
Si actualizas la aplicación, puedes desplegar la versión actualizada al introducir el mismo comando que utilizaste para desplegar la aplicación por primera vez. El nuevo despliegue crea una nueva versión de la aplicación y la promociona a la versión predeterminada. Las versiones anteriores de la aplicación se mantienen, al igual que las instancias de VM asociadas. Ten en cuenta que todas estas versiones de aplicaciones e instancias de VM son recursos facturables.
Si eliminas las versiones no predeterminadas de la aplicación, puedes reducir los costes.
Para eliminar una versión de la aplicación, sigue las instrucciones a continuación:
- En la consola de Google Cloud, ve a la página Versiones de App Engine.
- Selecciona la casilla de verificación de la versión no predeterminada de la app que deseas borrar.
- Para borrar la versión de la app, haz clic en Borrar.
Si quieres obtener información completa sobre cómo limpiar los recursos facturables, consulta la sección sobre limpiar los recursos en el último paso de este tutorial.
Estructura de la aplicación
En el siguiente diagrama, se muestran los componentes de la aplicación y cómo se conectan entre ellos.
Información sobre el código
En esta sección, se explica detalladamente el código de la aplicación y su funcionamiento.
Sobre las sesiones
Antes de que la aplicación pueda autenticar a los usuarios, necesitas almacenar información sobre el usuario actual en una sesión de alguna forma.
Express incluye una implementación basada en memoria, pero no es adecuada para una aplicación que se puede enviar de varias instancias de VM, ya que la sesión que se registra en una instancia puede diferir de otras instancias. La muestra de Bookshelf utiliza un objeto MemcachedStore
para almacenar datos de sesión en un servicio Memcache remoto especificado en config.json
.
Autenticar usuarios
La muestra de Bookshelf usa Passport.js
para administrar la autenticación de usuarios. Passport.js
requiere cierta configuración antes de poder autenticar usuarios:
Los permisos indican los elementos de la información del usuario a los que la aplicación tiene acceso. Google brinda múltiples servicios junto con un conjunto de ámbitos para cada servicio. Por ejemplo, hay un permiso que permite el acceso de solo lectura a Google Drive y otro permiso que permite el acceso de lectura y escritura. Esta muestra solo requiere los permisos básicos profile
y email
, que otorgan a la aplicación acceso a la dirección de correo electrónico del usuario y a la información básica del perfil.
Autenticar al usuario implica dos pasos básicos, que en conjunto se denominan flujo de servicio web:
- Redirigir al usuario al servicio de autorización de Google.
- Procesar la respuesta cuando Google redirige al usuario a la aplicación.
Redirigir a Google
La aplicación envía al usuario al servicio de autorización de Google. La aplicación genera una URL mediante el uso del ID de cliente y los permisos que necesita la aplicación.
Luego, la aplicación redirige al usuario a la URL generada. Se solicita al usuario que permita que la aplicación acceda a los permisos especificados. Después de haber aceptado, se redirigirá al usuario de vuelta a la aplicación.
Procesar la respuesta de autorización
Google envía al usuario de vuelta a la aplicación con un código de autorización. Este código, junto con el secreto de cliente, se puede intercambiar por las credenciales del usuario y otra información sobre él.
Este paso del flujo ocurre en el servidor en su totalidad, sin tener que redirigir al usuario. Este otro paso es necesario para verificar que el código de autorización es auténtico y que quien solicita las credenciales es tu aplicación.
Passport.js
facilita este paso:
Tras haber obtenido las credenciales, puedes almacenar información sobre el usuario.
Passport.js
serializa automáticamente al usuario para la sesión. Una vez que la información del usuario esté en la sesión, puede crear un par de funciones de middleware para facilitar el trabajo con autenticación:
Puedes usar la información provista por el middleware en las plantillas para indicar al usuario que está conectado o desconectado:
Personalización
Ahora que tienes la información del usuario que ha iniciado sesión disponible a través del middleware, puedes estar al tanto de los libros que subió cada usuario en la base de datos.
Ahora que tienes esa información en la base de datos, puedes mostrar al usuario qué libros han agregado por su cuenta a la base de datos.
Este código usa un nuevo método de modelo llamado listBy
. La implementación depende del backend de base de datos que se elija.