El gigante Google ha demostrado tener muchas bondades que nosotros como programadores ni siquiera sabemos que existen y que nos facilitarían mucho la vida con un poco de ingenio e investigación.

Para poder utilizar cualquiera de las APIs que posee Google y todos los datos que podemos guardar en su nube debemos realizar una serie de pasos casi quirúrgicos para que todo el procedimiento sea exitoso. Esto porque estas aplicaciones se tornan un poco quisquillosas y Google es estricto es cuanto a seguridad se refiere, lamentablemente no existe un recetario completamente exacto de lo que se debe hacer y estos “trucos” se descubren después de horas de prueba y error (bastantes horas). He aquí el objetivo de este y los siguientes artículos, una guía que funcione y que ayude a los que están a la deriva en este tema como lo estuve yo en su momento.

Autenticación y Autorización

Antes de cualquier cosa que podamos hacer, debemos decidir cómo vamos a manejar la seguridad de nuestra aplicación de Java (esto depende de la necesidad que tengamos). Para esto, Google utiliza un protocolo específico llamado OAuth2.0 que es lo que usa para hacer el proceso de autenticación y autorización entre nuestra aplicación (no importa el lenguaje, las librerías utilizadas están disponibles en varios lenguajes) y los servidores encargados de esta tarea del lado de Google.

Existen diversos escenarios que pueden ser cubiertos por este procedimiento:

https://developers.google.com/accounts/docs/OAuth2#scenarios

Como podemos ver en la documentación de Google del link anterior, se maneja según nuestra necesidad.

  • Web Server Applications son las aplicaciones web que se desarrollan normalmente. En el momento que se solicita la autenticación, la aplicación lo que va a hacer es a levantar una página de login para que se pueda poner el usuario y contraseña de Google, si es correcto se devuelve un código de autorización que maneja nuestra aplicación (todo el proceso es transparente para el usuario, el solo se debe preocupar por su correo y contraseña).

  • Installed Applications son aplicaciones de escritorio por ejemplo o para dispositivos móviles. Al igual que en las aplicaciones web, esta se encarga de levantar una página de login donde se debe digitar el usuario y la contraseña para poder acceder.

  • Client-Side (JavaScript) Applications son aplicaciones basadas meramente en Javascript. Igualmente la autenticación y autorización se basa en una ventana donde el usuario debe colocar su usuario y contraseña.

  • Applications on Limited-Input Devices son aplicaciones que corren sobre cierto tipo de hardware como consolas de juegos o impresoras. Utiliza el mismo método de autenticación que los anteriores.

  • Service Accounts son aplicaciones que actúan como si ellas mismas fueran los usuarios. No necesita la participación del usuario sino que la aplicación misma se encarga de comunicarse con los servidores de autenticación de Google.

Autenticación y autorización utilizando el método Service Accounts

En este caso vamos a empezar por ver la forma más complicada de utilizar la autenticación de Google que es el Service Accounts, o sea, una comunicación servidor a servidor entre la aplicación y el servicio Google. Lo que sucede en estos casos es que estas aplicaciones se encargan de hablar con los servidores de Google para autenticarse y pedir la información que el usuario necesita para el que todo el proceso es totalmente transparente ya que la que debe estar autorizada para accesar es la aplicación.

Lo primero que debemos hacer es crear una cuenta para nuestro proyecto en la Consola para Desarrolladores de Google. Para esto se debe tener una cuenta de Google (que es la misma que Gmail) y loguearse para tener todos los permisos necesarios. Una vez hecho este proceso, se desplegara un dashboard en donde encontraremos un botón para crear un nuevo proyecto.

Se desplegara una ventana donde vamos a poner el nombre de nuestro proyecto (el nombre debe ser un identificador), automáticamente se le dará un ID único. Daremos clic en crear.

Se desplegara una pantalla con una serie de opciones y dashboards.

Debemos buscar la opción APIs y autenticación, a continuación seleccionar la opción APIs. Aquí debemos asegurarnos que la API o APIs con las que vamos a trabajar estén en ON. Por ejemplo, si trabajamos con Google Analytics, debemos verificar que esté dentro de la lista de APIs habilitadas.

Si no es así, entonces buscamos la API que requerimos en la lista y damos clic en estado. Automáticamente se habilitará y se añadirá en la lista de APIs habilitadas. A continuación, nos moveremos a la opción Credenciales para registrar una nueva cuenta de servicio. Debajo de OAuth, vamos a dar clic en Crear ID de cliente nuevo, este ID se utiliza para que la aplicación solicite un token de acceso con protocolo OAuth 2.0.

En la ventana despegable, seleccionaremos Cuenta de Servicio (Service Account) y Crear ID de cliente.

Una vez terminado el proceso, el resultado será un par de claves (pública y privada). En nuestra computadora se descargara una llave privada, que únicamente tendremos nosotros y que debemos utilizar en nuestra aplicación por lo que debemos guardarla en un lugar seguro. Dicha llave tiene una contraseña que solo se muestra una vez, por lo que igualmente debemos colocarla en un lugar seguro para poder acceder a ella más adelante.

El resultado será un Id de cliente (en formato de correo electrónico .googleusercontent.com), una dirección de correo electrónico que utilizaremos como “dirección de usuario” en nuestra aplicación de Java (@developer.gserviceaccount.com).

Para más detalles sobre el procedimiento, puede consultar este segmento de documentación https://developers.google.com/console/help/new/#serviceaccounts que es la ayuda de la Consola de Desarrolladores sobre el Service Account.

El siguiente paso es registrar nuestro ID de cliente como usuario autorizado dentro de la API que vamos a utilizar. En este caso, vamos a seguir utilizando como referencia Google Analytics. Lo que debemos hacer es entrar a la consola de la API, buscar el módulo de administración y a continuación la opción que se presente para gestionar o administrar los usuarios autorizados para esa cuenta. Es importante recordar que Google permite administrar todas sus APIs o aplicaciones por medio de la misma cuenta de correo.

Nota: En el caso de Google Analytics que vamos a utilizar para este ejemplo, se debe proceder a crear una cuenta para nuestro proyecto específicamente. En esta oportunidad, vamos a asumir que ya la cuenta esta creada y entonces podemos agregar los usuarios. Como todas las APIs son distintas tienen distinta manera de administración pero aquí estamos tratando de hablar en términos generales. La configuración para usar Analytics la veremos en otro artículo.

Añadiremos el nuevo usuario utilizando el correo que nos proporcionó la Consola de Desarrolladores en el ítem Dirección de Correo Electrónico, debemos darle todos los permisos posibles para no tener ningún problema en el momento de la lectura o escritura de información.

Una vez que se registra el usuario, tenemos todo lo necesario para empezar a codificar el módulo de autenticación. Para este caso, utilizaremos el IDE NetBeans versión 8.0. Crearemos un nuevo proyecto que utilice Maven para el control de versiones. Si se desea un proyecto común también existe la opción de descargar las librerías y agregarlas manualmente.

En Nuevo Proyecto, buscamos la Categoría Maven y el tipo de proyecto Java Application. En la siguiente ventana vamos a colocar un nombre al proyecto y escoger el lugar donde lo vamos a guardar. Una vez creado el proyecto lo primero que vamos a hacer es descargar las librerías de Google que vamos a utilizar ya que estas son esenciales en la codificación.

En el caso de Maven:

Abrimos el archivo POM.xml localizado en el paquete Project Files, dentro de la sección dependencias vamos a colocar lo siguiente (a la fecha estas son las librerías más recientes):

<dependencies>
    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client</artifactId>
        <version>1.19.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.oauth-client</groupId>
        <artifactId>google-oauth-client</artifactId>
        <version>1.19.0</version>
    </dependency>
</dependencies>

Las referencias a las librerías de Google API Client que se deben colocar en el POM.xml se encuentran en el siguiente enlace http://mvnrepository.com/artifact/com.google.api-client/google-api-client/1.19.0. También se pueden descargar los .jar de ese mismo enlace, además se pueden buscar las librerías más recientes en este enlace http://mvnrepository.com/artifact/com.google.api-client/google-api-client.

Las referencias a las librerías de Google OAuth Client que deben ir en el POM.xml están en el siguiente enlace http://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client/1.19.0. También es accesible descargar los .jar o buscar las versiones más recientes en este link http://mvnrepository.com/artifact/com.google.oauth-client/google-oauth-client.

Cuando se da clic en el botón Guardar, automáticamente se empiezan a descargar las librerías del repositorio de Maven a nuestro proyecto en la carpeta Dependencies.

El siguiente paso es añadir la llave privada en formato PKCS #12 que descargamos en nuestra máquina. Para esto vamos a irnos a la carpeta donde guardamos el proyecto y buscamos una carpeta llamada Other Sources, que por lo general no aparece en el NetBeans porque al inicio está vacía. En la ruta src/main vamos a crear una carpeta llamada resources, ahí colocaremos la llave privada para incorporarla a nuestro proyecto.

Una vez que tenemos listo el ambiente, procedemos a crear las clases encargadas de manejar la autenticación. Una clase va a ser responsable de las credenciales fijas y las variables estáticas con las que se trabajara en toda la aplicación. La otra clase va a ser el cliente que va a ser el responsable de realizar la comunicación con los servidores de Google.

Clase OAuth2ClientCredenciales.java (Puntos importantes)

private static final String PATH_P12KEY_SERVICE_ACCOUNT = "";

En esta línea debemos colocar la ruta donde pusimos la llave privada anteriormente, o sea, /src/main/resources. Lo más recomendable es colocarlo en este sitio para que esté ligado al proyecto, pero también si se quiere más seguridad sobre la llave se puede poner en otra carpeta dentro de la maquina o en la nube mientras sea accesible para la aplicación.

private static final String SERVICE_ACCOUNT_EMAIL = "";

En esta línea se debe colocar el correo electrónico proporcionado por la Consola de Desarrolladores y que registramos en nuestra API como un usuario con permisos.

private static final String APPLICATION_NAME = "";

En esta línea debemos colocar el nombre de proyecto que dimos tanto en la Consola de Desarrolladores como en la API que vayamos a utilizar (si aplica), esto con el fin de que haya un orden lógico y que no haya problemas de incongruencia.

Clase OAuth2Client.java (Puntos importantes)

El método principal es obtenerServicio(), por medio del objeto GoogleCredential se establece la comunicación con los servidores de autenticación utilizando las credenciales que obtuvimos anteriormente por medio de la Consola de Desarrolladores.

Otro aspecto importante de recordar es que la autenticación se realiza tomando como base una de las APIs de Google, esto porque automáticamente el proceso se hace sobre una de las cuentas que se tienen registradas y con la cual el servicio es utilizado, además de que cuando se registra un nuevo proyecto siempre existirán APIs vinculadas (al menos las que están por default). Este proceso es lógico ya que si necesitamos algún tipo de autenticación vinculada a Google es porque vamos a utilizar alguno de los servicios que nos ofrece dentro de su masivo conjunto de herramientas.

En el caso de este ejemplo, vamos a seguir utilizando Google Analytics que fue con la misma con la que realizamos el registro del proyecto. Así que en el código, cargaremos un objeto tipo Analytics utilizando la credencial que construimos.

Para esto vamos a agregar la referencia a la librería que nos permite usar Analytics con Java. En el POM.xml añadiremos las siguientes líneas de código (a la fecha estas son las librerías más recientes) http://mvnrepository.com/artifact/com.google.apis/google-api-services-analytics/v3-rev99-1.19.0. También se pueden descargar los .jar de ese mismo enlace, además se pueden buscar las librerías más recientes en este enlace http://mvnrepository.com/artifact/com.google.apis/google-api-services-analytics.

Ya con las librerías agregadas en el proyecto, podremos utilizar el objeto Analytics, que se encuentra en el código, con el que vamos a hacer la prueba de que efectivamente pudimos autenticar nuestra aplicación de Java exitosamente y tenemos acceso a los datos.

El código de este tutorial esta en Github, de ahí se puede descargar. Los puntos que no queden claros sobre Analytics se cubrirán en los siguientes artículos (esto para hacer la respectiva prueba para cerciorarse si efectivamente se está logrando conectar nuestra aplicación con los servidores de Google, la razón por la cual se hace de esta manera es porque el único modo de saber si nuestras credenciales son funcionales o no es conectándolas con un API).

Código Fuente: https://github.com/FlechaRoja/autenticacion-google

La prueba que vamos a hacer para saber si todo está funcionando es que, según el código que hicimos para este artículo, este al final imprima un Id que será el mismo que está en el dashboard en este caso de la cuenta de Analytics que es lo que estamos utilizando para este ejemplo.

Es importante rescatar que la labor que hace el objeto tipo Analytics en este ejemplo, lo puede hacer cualquier otra API. En los ejemplos que podemos ver en la documentación oficial de Google, se pueden ver pruebas con Calendar, Google Plus, Analytics, Drive entre otros. Hay que tomar en cuenta que no todas las APIs se trabajan de la misma manera, las pruebas se pueden hacer con cosas distintas, en tal cosa si debemos consultar un poco más la documentación de Google dependiendo del producto o de nuestras necesidades.

Referencias

Autor

Katherine Peñaranda

Analista y Desarrolladora.

  • Bachiller en Informática Empresarial. UCR.
  • Oracle Certified Associate, Java SE 7 Programmer.

Flecha Roja Technologies, 2015.