La consola de desarrolladores de Google ofrece una plataforma para crear aplicaciones de primer nivel con una fácil integración de los servicios y herramientas que ofrece Google. Google Calendar es uno de estos servicios y el uso de un calendario puede ser ventajoso para proporcionar funcionalidades como la planificación/creación de eventos en proyectos como una aplicación de lista de tareas o un programador de reuniones.
Al desarrollar un proyecto con numerosas funcionalidades, el trabajo de un desarrollador será mucho más fácil al hacer uso de las API para tareas menores y al centrarse realmente en el propósito de la aplicación. En lugar de codificar su propia lógica para almacenar atributos de calendario, permisos de usuario y detalles de gestión de eventos, podemos usar la API de Google Calendar, que viene con módulos de calendario y seguridad integrados. Nos ahorraremos la molestia de coordinar eventos superpuestos, enviar recordatorios, notificaciones, etc.
Este artículo cubre la integración de Google Calendar API en la aplicación NodeJS y la creación de nuevos eventos con autenticación de cuenta de servicio. Nuestro objetivo es integrar los servicios de Google Calendar en la aplicación NodeJS. Necesitamos probar si los métodos de calendario funcionan en nuestra aplicación NodeJS de back-end con los mecanismos adecuados de manejo de errores en caso de credenciales incorrectas o falta de permisos otorgados al usuario. Las 2 funciones del calendario que están integradas en este proyecto son ver eventos y agregar eventos.
Acercarse:
- Primero crearemos un nuevo proyecto de nube de Google en la consola de desarrolladores de Google. Este es el paso inicial para usar los servicios de Google Cloud, administrar las API y los permisos, y controlar a los colaboradores del proyecto.
- Después de crear un nuevo proyecto, el siguiente paso es habilitar la API. Un proyecto puede tener más de una API habilitada. Requeriremos solo uno y ese es » API de Google Calendar «.
- Ahora debemos comprender cómo funcionan la autenticación y la autorización en Google Workspace. Primero, revisemos las definiciones de estos 2 términos.
- Autenticación : el proceso de verificar la identidad.
- Autorización : verificar si la aplicación/usuario puede acceder a ciertos recursos.
- Google Workspace ofrece dos tipos de autenticación: autenticación de usuario y autenticación de aplicaciones. Usaremos la autenticación de la aplicación , en la que la aplicación se autentica en nombre del usuario para usar los servicios de Google.
¿Por qué usamos la «autenticación de la aplicación»?
- Dado que nuestra declaración del problema es integrar los servicios de calendario en NodeJS, no trataremos con ningún código de interfaz. Con la autenticación de la aplicación, no se requiere que el usuario inicie sesión y nuestro servidor se comunicará directamente con los servidores de Google.
Ahora bien, ¿cómo se verificará nuestra identidad o cómo se llevará a cabo la autenticación?
- La autenticación en Google Workspace requiere «credenciales». Las credenciales son una «forma de identificación», que verificará la identidad de la aplicación/usuario.
- Entre las 3 credenciales de autenticación que ofrece Google (clave API, consentimiento OAuth 2, cuenta de servicio), usaremos » Cuenta de servicio «. Una cuenta de servicio se usa principalmente para «interacciones de servidor a servidor» y también se puede ampliar para acceder a los datos del usuario si es necesario. Una cuenta de servicio es útil cuando tenemos una aplicación de back-end que se comunicará directamente con los servidores de Google.
- La cuenta de servicio será una cuenta que pertenece a nuestra aplicación en lugar del usuario. Nuestra aplicación manejará el trabajo de llamar a la API del calendario sin involucrar directamente a los usuarios .
- Las credenciales de esta cuenta requieren la creación de una clave, que se descargará en forma de archivo JSON en el sistema del usuario. Los datos en el archivo JSON son las credenciales que se utilizarán en nuestra aplicación.
- La autorización se realizará mediante el código que escribiremos. Google almacena calendarios en la nube y nuestra aplicación debe tener los derechos para acceder a los datos/recursos almacenados en la nube.
- Siempre que accedamos a un método de calendario, las credenciales de la cuenta de servicio y nuestra llamada de método se combinarán en una solicitud (para realizar una llamada API autorizada) y se enviarán al servidor de autorización de Google. Esta solicitud será entregada por un «cliente» ya sea haciendo uso de la biblioteca de clientes de Google o directamente a través de HTTP/REST.
- En nuestro proyecto, enviaremos a través de HTTP declarando un cliente JWT. El servidor luego devolverá un token de acceso. Nuestra aplicación utilizará este token de acceso para realizar cambios en el calendario.
- El siguiente paso sería crear un nuevo calendario en el sitio web de Google Calendar (mencionado más adelante en el artículo) y agregar el correo electrónico de la cuenta de servicio como un usuario que tiene permiso para realizar cambios en el calendario.
- Finalmente, creamos nuestra aplicación NodeJS usando Express e instalaremos el paquete » googleapis «(una biblioteca cliente de NodeJS para acceder a las API de Google).
- Realizaremos 2 operaciones en el calendario usando la llamada calendar.events :
- Ver eventos para la fecha actual
- Agregar nuevo evento
Ahora comencemos con la implementación por pasos del enfoque anterior.
En primer lugar, veremos la configuración del proyecto y las credenciales en Google Developers Console.
Paso 1: Abra la consola de Google y haga clic en el menú desplegable para seleccionar un proyecto. Estaremos creando un nuevo proyecto. Haga clic en «NUEVO PROYECTO» en la parte superior derecha. Proporcione un nombre de proyecto adecuado y haga clic en crear.
Paso 2: el panel de la consola de Google se mostrará después de crear un proyecto. Asegúrese de estar viendo el tablero de su proyecto recién creado para agregar la funcionalidad del calendario de Google.
Paso 3: haga clic en la pestaña API y servicios presente en la sección «Más productos» hacia la izquierda y luego haga clic en «Habilitar API y servicios».
Paso 4: Se mostrará la biblioteca API. Desde aquí podemos seleccionar qué APIs queremos habilitar para nuestro proyecto. Como vamos a integrar el calendario de Google, escriba «Calendario» en el cuadro de búsqueda y seleccione «API de Google Calendar».
Paso 5: Se mostrarán todos los detalles de la API de Google Calendar, incluida la documentación y los servicios de la API. Haga clic en habilitar para agregar esta API a su proyecto.
Paso 6: Ahora crearemos la cuenta de servicio para nuestra aplicación. Haga clic en «CREAR CREDENCIALES» para crear una cuenta de servicio.
Paso 7: seleccione «Google Calendar API» como tipo de API para la credencial.
Paso 8: ahora se le preguntará «¿A qué datos accederá?», Mientras creamos una cuenta de servicio, haga clic en «Datos de la aplicación» y «Siguiente».
Paso 9: A continuación, ingrese los detalles de la cuenta de servicio, como el nombre de la cuenta y la identificación de la cuenta de servicio se generará simultáneamente. Luego haga clic en «Crear y continuar».
Paso 10: Seleccionaremos el rol de “Propietario” para dar acceso a la cuenta de servicio a nuestra aplicación. Después de agregar el rol, haga clic en continuar.
Paso 11: Este paso es opcional. Depende de usted otorgar derechos de administrador a una persona específica o a un grupo de personas que puedan administrar la cuenta de servicio. Haga clic en Listo.
Paso 12: La cuenta de servicio ha sido configurada. Ahora se deben crear las credenciales para esta cuenta de servicio. La clave asociada con esta cuenta de servicio se puede descargar como un archivo JSON. Nos referiremos a esto como un » archivo de clave de servicio » en pasos posteriores. Haga clic en el correo electrónico en Cuenta de servicio.
Paso 13: Vaya a la pestaña CLAVES y haga clic en AGREGAR CLAVE.
Paso 14: Crearemos una nueva clave y seleccionaremos JSON como tipo de clave. Haga clic en crear.
Paso 15: la clave privada se crea y se descarga como un archivo JSON. ¡Recuerde que este archivo es altamente confidencial y sus credenciales no deben ser públicas!
Paso 16: Todavía necesitamos el número de proyecto para configurar el calendario. Haga clic en la opción de menú de 3 puntos en la parte superior derecha y haga clic en «Configuración del proyecto».
Paso 17: Copie el número de proyecto y guárdelo en un lugar seguro para uso futuro.
Paso 18: Ahora configuraremos un calendario de Google y recuperaremos su ID. El calendario requerirá las credenciales que tenemos en el archivo JSON. Vaya a Google Calendar y cree un nuevo calendario haciendo clic en ‘+’ al lado de «Otros calendarios».
Paso 19: Ingrese el nombre y la descripción, luego haga clic en «Crear calendario».
Paso 20: Haga clic en el menú de 3 puntos junto al calendario recién creado y haga clic en «Configuración y uso compartido».
Paso 21: desplácese hacia abajo hasta la sección «Integrar calendario» y copie la ID del calendario. Guarde esta identificación en un lugar seguro para usarla en el futuro. Abra el archivo de clave de servicio JSON y copie el «correo electrónico del cliente». Vaya a la sección «Compartir con personas específicas» y «Agregar personas» pegando el correo electrónico del cliente copiado.
Ahora configuraremos la aplicación Express.
Paso 1: Cree una nueva carpeta con un nombre adecuado. Usaremos «Google_Calendar».
Paso 2: Ejecute los siguientes comandos en la terminal:
npm inicializar -y
npm expreso googleapis
Estructura del proyecto: Tendrá el siguiente aspecto.
Paso 3: Cree un archivo index.js. Este será el archivo principal donde integraremos Google Calendar. Al principio, vamos a ver los eventos. En este archivo la secuencia lógica es:
- Requiere paquetes necesarios como express y googleapis.
- Declare todas las credenciales necesarias del «archivo de clave de servicio» JSON, como la clave privada, el correo electrónico del cliente , etc.
- Use el número de proyecto y la identificación del calendario que habíamos adquirido en los pasos anteriores.
- Declare un cliente JWT (JSON Web Token) usando credenciales. Este cliente JWT utilizará las credenciales de la cuenta de servicio para autenticar nuestra aplicación en los servidores de Google.
- El ALCANCE define el nivel de autorización asociado con la llamada a la API utilizando el cliente JWT. Dado que primero mostraremos los próximos eventos, el ALCANCE es de «solo lectura».
- El cliente JWT se utilizará para enviar una solicitud a los servidores de Google.
- El servidor de Google devolverá un token de acceso.
- Este token de acceso se utilizará para llamar a la API de Google.
- Defina un objeto de calendario utilizando el número de proyecto y el cliente JWT.
- Declare la ruta de inicio que mostrará 10 próximos eventos agregados al calendario ordenados por su hora de inicio. Si no hay ningún evento programado para una fecha futura o actual, se mostrará «No se encontraron próximos eventos».
- Se accede a los eventos mediante calendar.events.list. Los resultados devueltos por esta llamada se devolverán al navegador mediante JSON.stringify.
Inserte el siguiente código en el archivo index.js :
index.js
//index.js code for integrating Google Calendar const express = require('express'); const { google } = require('googleapis'); const app = express(); const SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'; const GOOGLE_PRIVATE_KEY="<private-key>" const GOOGLE_CLIENT_EMAIL = "<client-email>" const GOOGLE_PROJECT_NUMBER = "<project-number>" const GOOGLE_CALENDAR_ID = "<calendar-id>" const jwtClient = new google.auth.JWT( GOOGLE_CLIENT_EMAIL, null, GOOGLE_PRIVATE_KEY, SCOPES ); const calendar = google.calendar({ version: 'v3', project: GOOGLE_PROJECT_NUMBER, auth: jwtClient }); app.get('/', (req, res) => { calendar.events.list({ calendarId: GOOGLE_CALENDAR_ID, timeMin: (new Date()).toISOString(), maxResults: 10, singleEvents: true, orderBy: 'startTime', }, (error, result) => { if (error) { res.send(JSON.stringify({ error: error })); } else { if (result.data.items.length) { res.send(JSON.stringify({ events: result.data.items })); } else { res.send(JSON.stringify({ message: 'No upcoming events found.' })); } } }); }); app.listen(3000, () => console.log(`App listening on port 3000!`)); // This code is contributed by Yashi Shukla
La clave privada, el correo electrónico del cliente se puede obtener del archivo JSON. El ID del calendario y el número de proyecto que almacenó anteriormente se utilizarán aquí.
Paso para ejecutar la aplicación:
Node index.js
o
índice de nodemon.js
Salida: la salida se puede ver en su navegador usando este enlace: http://localhost:3000/
Esta ruta mostrará 10 próximos eventos en el calendario o «No se encontraron próximos eventos» si no se han agregado eventos.
Dado que este es un calendario recién creado, no hay próximos eventos.
Paso 4: Insertar nuevos eventos. Google ofrece diferentes métodos para administrar y controlar los eventos que se agregan al calendario. Podemos agregar nuevos eventos usando el método calendar.events.insert() . Tendremos que hacer algunos cambios en el rol del usuario agregado en el paso 6 de la configuración de Google Calendar. Vuelva a la sección «Compartir con personas específicas» y cambie la función de su cuenta de servicio de «Ver todos los detalles del evento» a «Realizar cambios en los eventos».
Paso 5: Dado que ahora vamos a editar eventos, nuestra aplicación debe autenticarse como una cuenta de servicio. Para este tipo, lo siguiente en el símbolo del sistema (directorio raíz del proyecto) y en lugar de KEY_PATH, coloque la ruta completa de su archivo de clave de servicio JSON.
establecer GOOGLE_APPLICATION_CREDENTIALS=KEY_PATH
Paso 6: Cree una nueva ruta para agregar un evento (/createEvent) en index.js . Para simplificar, codificaremos los detalles del evento. Según la documentación de Calendar API, el objeto de evento se puede definir como:
Javascript
//A sample event object for calendar var event = { 'summary': 'My first event!', 'location': 'Hyderabad,India', 'description': 'First event with nodeJS!', 'start': { 'dateTime': '2022-01-12T09:00:00-07:00', 'timeZone': 'Asia/Dhaka', }, 'end': { 'dateTime': '2022-01-14T17:00:00-07:00', 'timeZone': 'Asia/Dhaka', }, 'attendees': [], 'reminders': { 'useDefault': false, 'overrides': [ {'method': 'email', 'minutes': 24 * 60}, {'method': 'popup', 'minutes': 10}, ], }, };
Puede dar sus propios valores de fecha, hora, ubicación, descripción según su elección.
Paso 7: el cliente JWT definió un ámbito de «solo lectura» para las llamadas a la API. Sin embargo, si queremos agregar nuevos eventos, un alcance de «solo lectura» no será suficiente.
- Así que ahora declaremos otro cliente «auth», que contiene las credenciales para la autenticación, como la ruta del archivo de clave de servicio JSON y la autorización SCOPE como » https://www.googleapis.com/auth/calendar » para obtener acceso completo a Google Calendar. API.
- El cliente de autenticación realizará un proceso en segundo plano similar al cliente JWT de solicitar un token de acceso de los servidores de autenticación de Google para realizar una llamada a la API.
El siguiente es el código para declarar el cliente «auth»:
Javascript
//Creating an aunthenticated client to call events.insert() const auth = new google.auth.GoogleAuth({ keyFile: '<FULL-PATH-OF-JSON-FILE>', scopes: 'https://www.googleapis.com/auth/calendar', //full access to edit calendar }); auth.getClient().then(a=>{ calendar.events.insert({ auth:a, calendarId: GOOGLE_CALENDAR_ID, resource: event, }, function(err, event) { if (err) { console.log('There was an error contacting the Calendar service: ' + err); return; } console.log('Event created: %s', event.data); res.jsonp("Event successfully created!"); }); })
En el código final de index.js tenemos:
- Creó una nueva ruta «/createEvent» para permitir a los usuarios agregar nuevos eventos al calendario.
- Dado que solo usamos NodeJS, los detalles del evento estarán codificados. Un objeto de evento se declara con los valores necesarios para campos clave como descripción, nombre, resumen, hora de inicio, hora de finalización, etc.
- Nuestra aplicación puede agregar este evento usando » calendar.events.insert «. Esta operación es autenticada y autorizada por una instancia del cliente google.auth.GoogleAuth «auth».
- Después de agregar un evento, cuando el usuario vuelva a visitar la ruta de inicio, se mostrarán los detalles del nuevo evento (siempre que la fecha de inicio del evento sea la fecha actual o futura).
A continuación se muestra el código final para index.js:
index.js
//Final index.js code const express = require('express'); const { google } = require('googleapis'); const app = express(); const SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'; const GOOGLE_PRIVATE_KEY="<private-key>"; const GOOGLE_CLIENT_EMAIL = "<client-email>" const GOOGLE_PROJECT_NUMBER = "<project-number>" const GOOGLE_CALENDAR_ID = "<calender-id>" const jwtClient = new google.auth.JWT( GOOGLE_CLIENT_EMAIL, null, GOOGLE_PRIVATE_KEY, SCOPES ); const calendar = google.calendar({ version: 'v3', project: GOOGLE_PROJECT_NUMBER, auth: jwtClient }); app.get('/', (req, res) => { calendar.events.list({ calendarId: GOOGLE_CALENDAR_ID, timeMin: (new Date()).toISOString(), maxResults: 10, singleEvents: true, orderBy: 'startTime', }, (error, result) => { if (error) { res.send(JSON.stringify({ error: error })); } else { if (result.data.items.length) { res.send(JSON.stringify({ events: result.data.items })); } else { res.send(JSON.stringify({ message: 'No upcoming events found.' })); } } }); }); app.get("/createEvent",(req,res)=>{ var event = { 'summary': 'My first event!', 'location': 'Hyderabad,India', 'description': 'First event with nodeJS!', 'start': { 'dateTime': '2022-01-12T09:00:00-07:00', 'timeZone': 'Asia/Dhaka', }, 'end': { 'dateTime': '2022-01-14T17:00:00-07:00', 'timeZone': 'Asia/Dhaka', }, 'attendees': [], 'reminders': { 'useDefault': false, 'overrides': [ {'method': 'email', 'minutes': 24 * 60}, {'method': 'popup', 'minutes': 10}, ], }, }; const auth = new google.auth.GoogleAuth({ keyFile: '<full-path-of-JSON-file>', scopes: 'https://www.googleapis.com/auth/calendar', }); auth.getClient().then(a=>{ calendar.events.insert({ auth:a, calendarId: GOOGLE_CALENDAR_ID, resource: event, }, function(err, event) { if (err) { console.log('There was an error contacting the Calendar service: ' + err); return; } console.log('Event created: %s', event.data); res.jsonp("Event successfully created!"); }); }) }) app.listen(3000, () => console.log(`App listening on port 3000!`)); // This code is contributed by Yashi Shukla
Ahora Comprobando evento creado. Abra su navegador y vaya a http://localhost:3000/createEvent.
Producción:
Se mostrará la siguiente salida
Ahora como recordarán, anteriormente en la sección de salida, se mostraba “No hay próximos eventos”. Ahora ve de nuevo a http://localhost:3000/. ¡Se mostrarán los detalles de su evento recién creado!
Continúe con Google Calendar y también podrá ver el evento recién creado agregado allí.
Salida final: