Integración de servicios financieros abiertos: el caso de BBVA API Market

Abian Marrero
The Cocktail Engineering
5 min readMay 18, 2016

--

Photo by Drew Patrick Miller

Uno de los retos tecnológicos a los que se enfrenta la banca es cómo ofrecer servicios de valor añadido basados en la operativa bancaria tanto a clientes de la entidad como a terceras partes. Tradicionalmente el entorno bancario ha estado, por definición, blindado en torno al core banking con unos requerimientos de seguridad, estabilidad y predecibilidad (no olvidemos que es el software que maneja nuestros movimientos) que hacen muy complicada tanto la integración de datos como el desarrollo de aplicaciones de negocio adicionales.

Debido a esto muchas de las aplicaciones más populares de fintech se dedican a hacer scraping del HTML de la página del banco para realizar una integración lo que, como nos podemos imaginar, deja bastante que desear (por ejemplo, necesitan que aportemos nuestras claves de seguridad).

Consciente de esto, BBVA está promoviendo el uso de sus servicios financieros por parte de terceros y para ello ha abierto una API que permite el acceso de clientes y consulta de sus productos como cuentas, tarjetas, movimientos, transferencias, etc. Estas APIs son abiertas y accesibles para cualquiera en BBVA API Market.

En The Cocktail nos hemos planteado cómo de fácil (o difícil) es construir un recubrimiento de estas APIs en un lenguaje para el que inicialmente no estaban pensadas (en este caso Ruby).

Para usar este servicio necesitamos registrarnos en BBVA API MARKET, autorizar la aplicación que usará dicho servicio (client_id y secret_id) y por último implementar la autenticación de los usuarios usando el protocolo OAuth2 para poder empezar a consultar sus datos. De esta forma es el propio usuario el que da su consentimiento expreso al tratamiento de datos por parte de un tercero, exactamente igual a como ya hacen aplicaciones como Facebook Connect.

¿Cómo hacerlo usando Ruby?

Una de las mejores maneras de autenticarnos con servicios de terceros en Ruby es usando Omniauth, ya que permite encapsular toda la lógica de
autenticado y obtención de credenciales de manera que tengamos una caja negra que podamos distribuir fácilmente sin necesidad de explicar su funcionamiento interno.

OmniAuth es una librería de bajo nivel que estandariza la autenticación de aplicaciones web, está basada en “Strategies” que es la manera con la que nos conectamos con un proveedor determinado y el cual podemos crear tantos como necesitemos, ya que es multi-proveedor. Cada uno de ellos es un Rack Middleware que responderá a peticiones bajo /auth/:provider y /auth/:provider/callback donde el “provider” es la estrategia.

Hemos creado la gema omniauth-bbva en https://github.com/the-cocktail/omniauth-bbva que encapsula el protocolo Oauth2, endpoints y toda la lógica propia del servicio que da BBVA, de esta manera solo tendremos que preocuparnos de dos cosas, hacer una redirección a “/auth/bbva” cuando queramos autenticar con un usuario y guardar las credenciales que nos llegaran a “/auth/bbva/callback”

Creando Omniauth-bbva

Lo primero que debemos hacer es crear una nueva clase Bbva bajo el modulo OmniAuth::Strategies e incluir Omniauth::Strategy que nos proporciona la base sobre la que implementar nuestra estrategia.

Una vez hecho esto hay que definir las tres fases de autenticación que se ejecutan secuencialmente, para ello debemos sobreescribir los siguiente métodos:

  1. setup_phase(opcional): aquí estableceremos los parámetros de nuestra conexión (client_id, secret, request_url, etc) solo si necesitamos cambiar dichos parámetros en tiempo de ejecución, ya que por defecto Omniauth utilizará aquellos que le hemos pasado en la inicialización de nuestro provider.
  2. request_phase: encargada de crear el authorize_url del servicio externo a donde redigirá al usuario para usar sus credenciales (login) y dar permiso a nuestra app.
  3. callback_phase: Una vez autenticados el proveedor nos mandará la autorización de acceso a la url que le digamos (/auth/bbva/callback) con un code con el cual podremos hacer la petición de obtención de credenciales.

Por último es recomendable también cambiar el método “credencials” que es el que establece el formato del hash que contendrá las credenciales.

Usando la gema en un proyecto Rails

Usar la gema en Rails y empezar a hacer consultas a los servicios de BBVA es bastante sencillo, solo bastaría con hacer:

1º Añadir el proveedor en config/omniauth.rb

Solo es necesario establecer la url del callback, los demás parámetros en caso de ser omitidos tomarán los valores por defecto del entorno sandbox de BBVA.

2º Redirigir “/auth/bbva/callback” a un controllador donde queramos recibir las credenciales a guardar:

en este caso en sessions#create guardaríamos el hash que contiene request.env[‘omniauth.auth’] , teniendo una estructura similar a esta:

Con solo estos 2 pasos tendríamos la base para autorizar a cualquier cliente de BBVA y empezar a consultar sus datos, bastaría con redirigir a los usuarios a “/auth/bbva” y Omniauth creará y redigirá a la URL del login de BBVA de manera transparente para nosotros, obteniendo las credenciales en en nuestro callback.

Debemos controlar el tiempo de expiración del token (expires_at), y en caso que haya caducado renovarlo con el método refresh_token, que nos devolverá los nuevos access_token, refresh_token y expires_in.

Usando el Cliente

La gema viene un con cliente Bbva::Client que podemos utilizar para la consulta de servicios como accounts, cards e identity.

Para ello basta con incluir el cliente en el controlador que queramos

Instanciarlo con las credenciales que guardamos en sessions#create

Y ya podemos empezar a usarlo

Como veis conectar con servicios de terceros es muy sencillo y limpio haciendo uso de Omniauth, ya sea creando tu propia estrategia o usando una de los tantas que hay en la lista oficial.

--

--