¿Cuando hacer uso de herramientas de terceros?

En ocasiones, a la hora de desarrollar funcionalidades nuevas, nos vemos en la tesitura de invertir un gran número de horas y hacerlo tú mismo, o acudir a aplicaciones o paquetes de terceros. Es una decisión que se debe de tomar teniendo en cuenta costes, beneficios tecnológicos, facilidad de uso, etc.

Google, nos aporta gran número de herramientas que nos hacen la vida más sencilla. Maps, Calendar, Gmail, Docs, son algunas de las herramientas que usamos en nuestro día a día y que, en ocasiones, podemos hacer uso en nuestros desarrollos, como el caso que explicaremos hoy en el que integraremos Google Calendar.

Para poder hacer uso de estas herramientas, Google nos ofrece su completísima API, además de paquetes o SDKs para los lenguajes más usados que nos ayudarán mucho en la integración.

Comencemos

Este artículo va dirigido a aquellas personas que tienen conocimientos en el framework Laravel, por lo que ni se compartirá la totalidad del código, ni se darán grandes detalles de todo el proceso.

Configuración de la API

Para comenzar, deberemos de tener una cuenta de Google, y acudir a la consola de Google Cloud y crearemos un nuevo proyecto para tenerlo todo más organizado.

En este proyecto, habilitaremos una nueva API, en nuestro caso hemos elegido Google Calendar API que nos permitirá tener uno de los calendarios más completos y fáciles de usar, integrado en nuestra aplicación.

Una vez habilitada, debemos de configurar la pantalla de consentimiento, en el que deberemos de elegir entre dos opciones:

  • Uso Interno: Donde solo harán uso de ésta, miembros de tu misma organización (cuentas de Google Workspace).

  • Uso Externo: Donde cualquiera puede hacer uso de ésta, pero ojo, Google tendrá que verificar el buen uso que estamos haciendo de ella a la hora de publicarla. Mientras desarrollamos, bastará con añadir usuarios de prueba.

Permisos: Podremos elegir los endpoints a los que accederemos.

Usuario de pruebas: Para el desarrollo.

A continuación, debemos de crear una credencial para esta API de tipo clientes OAuth 2.0, cuya principal configuración será URI de redireccionamiento autorizados, que será donde se nos redireccionará una vez que el usuario dé su consentimiento. Esta redirección vendrá con algunos parámetros entre ellos un código que nos servirá para crear los tokens de acceso a la API. Una vez creado podremos descargar nuestra credencial en formato json que guardaremos para hacer uso de él más tarde.

Hora de desarrollar

En nuestro caso consumiremos la API desde una aplicación construida con Laravel, por lo que haremos uso del paquete que nos proporciona Google para el lenguaje PHP. google/apiclient Esta librería nos ayudará a integrar muchas de las APIs de la plataforma.

Llegado a este punto, es hora de ponerse a picar código. En algún momento deberemos de solicitar al usuario que dé consentimiento de acceso a su información es momento de crear un cliente y redirigir a la AuthUrl.

public  function  getConsent()
{
   $this->client =  new Google\Client();
   $this->client->setApplicationName('Calendar');
   $this->client->setScopes($scopes);
   $this->client->setAuthConfig(base_path().'/client_secret.json');
   $this->client->setAccessType('offline');
   $this->client->setPrompt('select_account consent');
   $authUrl =  $this->client->createAuthUrl();
   return  redirect()->to($authUrl);
}

Como vemos, necesitamos meter nuestro archivo client_secret.json en el proyecto para hacer uso de él.

Una vez que de su consentimiento, será redirigido a un endpoint que prepararemos para recoger el código que usaremos para crear nuestro token de acceso y poder seguir consumiendo la API.


public  function  storeToken(Request $request)
{
   $scopes =  array(\Google_Service_Calendar::CALENDAR);
   $this->client =  new  Client();
   $this->client->setApplicationName('Calendar');
   $this->client->setScopes($scopes);
   $this->client->setAuthConfig(base_path().'/client_secret.json');
   $this->client->setAccessType('offline');
   $this->client->setPrompt('select_account consent');

   $code = $request->only('code');

   $token =  $this->client->fetchAccessTokenWithAuthCode($code['code']);

   GoogleToken::updateOrCreate(['token_type'  => $token['token_type']], $token);
}

En este caso estamos recogiendo nuestro código, generamos un nuevo token y lo guardamos en base de datos para futuros usos.

Ahora ya podemos acceder a los calendarios de nuestro usuario. Es hora de consultar nuestros calendarios, y lo primero será listar los calendarios disponibles.

public  function  getCalendars()
{
   $service =  new Google\Service\Calendar($this->client);
   $calendars = $service->calendarList->listCalendarList();
   return $calendars;
}

En este caso no mostraremos cómo crear un nuevo cliente, puesto que ya lo mostramos en el primer código. Una vez creado, se lo pasaremos al Servicio de Calendar y accederemos a la lista de calendarios de esta manera tan sencilla.

Ya tenemos un listado de calendarios, lo siguiente sería obtener los próximos eventos de uno de los calendarios:

public  function  getEventsById($id)
{

   $service =  new  Calendar($this->client);
   $calendarId = $id;
   $optParams =  array(
              'orderBy'  =>  'startTime',
              'singleEvents'  =>  true,
              'timeMin'  =>  date('c'),
            );
   $results = $service->events->listEvents($calendarId, $optParams);
   $events = $results->getItems();
   return $events;
}

El calendarId nos será proporcionado en el listado de calendarios. Como podéis observar de nuevo, el consumo de la API con este paquete nos facilita mucho la tarea.

Estos, y otros métodos nos serán explicados en la documentación oficial