Latch: Pestillo Digital en CodeIgniter

Hace poco más de un mes descubrí Latch, una herramienta que me llamó mucho la atención, tanto por su concepto como por la sencillez de su implementación. No voy a profundizar demasiado en su definición ya que muchos de vosotros seguro que habéis oído hablar de esta utilidad.

Para los que no conozcan Latch, se trata de un servicio en la nube creado por ElevenPaths que permite añadir una capa de seguridad más para proteger tu identidad en la red. Su principal objetivo es dotar al usuario final de una llave digital, gestionada mediante una aplicación móvil, a través de la cual poder bloquear su cuenta en algún servicio online cuando no vaya a ser utilizado, es decir, poder apagar o encender una cuenta en cualquier momento. De este modo aunque alguien sepa nuestras credenciales no podría acceder al servicio y recibiríamos una notificación en el móvil del intento de acceso.

En este post voy a explicar cómo deberíamos integrar Latch en una página web desarrollada en CodeIgniter. Como resultado todos los usuarios registrados en nuestra web podrán vincular sus cuentas para poder apagarlas cuando no vayan a acceder.

Asociar cuenta de usuario a la aplicación móvil

Cualquier usuario que quiera usar Latch en un servicio que lo tenga implementado debe:

  1. Crear una cuenta de usuario.
  2. Descargar la app e iniciar sesión.
  3. Añadir un nuevo servicio.Añadir un nuevo servicio
  4. Generar un código de pareo.Generar un código de pareo
  5. Introducir el código en el formulario de la web para asociar la cuenta, acción llamada Pareo. Si todo es correcto obtendremos un mensaje de confirmación con opciones para configurar.Mensaje de confirmaciónSi la operación realizada es el despareo obtendremos el siguiente mensaje.Mensaje de despareo
  6. Ahora podremos configurar el servicio a nuestro antojo.Configurar el servicio La opción Autobloqueo por tiempo, permite bloquear la cuenta automáticamente tras un tiempo establecido (El tiempo de autobloqueo se puede configurar en las opciones de la app).
    La segunda opción, Programar bloqueo, nos da la posibilidad de elegir las horas en las que queremos que la cuenta permanezca bloqueada.Programar bloqueoSi no se quiere configurar el bloqueo programado se podrá realizar el bloqueo total de la aplicación deslizando el botón superior.
  7. Desde el menú principal de la app podremos gestionar cada aplicación por separado o bloquear/desbloquear todas a la vez.Gestionar aplicaciones
  8. Cuando una aplicación este bloqueada y se intente acceder a ella recibiremos una notificación.Notificación de intento de acceso

Implementación de Latch

La implementación de Latch podría dividirse en 3 apartados.

1.   Crear una cuenta de desarrollador

Para registrarse como desarrollador no se necesitan datos personales (son opcionales), tan sólo debemos introducir el nombre, mail y una contraseña.

Encontramos el formulario de registro en la columna derecha del “Área de Desarrolladores” de la página oficial de Latch.

Formulario de registro en la columna derecha

2.   Registrar una aplicación que Latchear

Una vez creada la cuenta podremos acceder al panel de control. Aquí dispondremos de mucha información referente al funcionamiento, documentación y SDKs, suscripciones, etc.

Para crear una aplicación accederemos al menú “Mis Aplicaciones” y le daremos un nombre. En mi caso “Portal Cliente Latch”.

Crear una aplicación

En esta pantalla obtendremos los datos necesarios para poder configurar Latch. Los más importantes son el campo ID de aplicación y Secreto con los que podremos inicializar la instancia del API de Latch.

Existen otras funcionalidades muy interesantes como el 2º factor OTP, que envía un código de un sólo uso al móvil con el objetivo de añadir una capa más de seguridad. Además podremos configurar la aplicación para que se bloquee después de cada consulta de estado.

3.   Integración en CodeIgniter

Este apartado es el más importante de la implementación. Voy a intentar ser breve pero claro a la vez. No explicaré características básicas de CodeIgniter ya que entiendo que todo aquel que haya llegado a este punto tiene unos conocimientos mínimos de este framework.

Configuración

Agregaremos un archivo de configuración (latch.php) con el ID de aplicación y el Secreto obtenidos en el apartado 2.

Agregar archivo latch.php

SDK de PHP

Descargaremos el SDK de PHP desde el menú “Documentación y SDKs – Plugins y SDKs” dentro del panel de control y lo añadiremos a nuestra carpeta de librerías.

SDK de PHP

Añadir librería

Para facilitar la integración de Latch he creado la librería “LatchApi” que hace uso del SDK de PHP agregado en el paso anterior.

Añadimos el archivo “LatchApi.php” al directorio de librerías de CodeIgniter y la cargamos en nuestro controlador.

                $this->load->library(‘latchapi’);

Esta librería consta de varias funciones para realizar las operaciones de pareo, despareo, consulta de estado y consulta del token de segundo factor.

Parear

Con el código introducido por el usuario realizamos el pareo mediante la función pair() de la librería.

Parear

Desparear

Para desparear una cuenta llamamos a la función unpair().

Desparear

Estado

Una de las acciones más importantes es consultar el estado de la cuenta para permitir o bloquear el acceso a nuestra aplicación. La función status() nos devuelve verdadero o falso para el estado desbloqueado y bloqueado respectivamente.

Estado

Segundo factor OPT

Si la aplicación tiene configurado el segundo factor podremos obtener el valor del código enviado al móvil del usuario con la función get_OptToken().

Segundo factor OPT

Si quisiéramos limitar el tiempo de validación del código opt, podemos obtener la marca horaria en la que se generó el token con la función get_OptGenerated()

A continuación os dejo el código completo de la librería LatchApi.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); include_once FCPATH.'/application/libraries/latch/Latch.php'; include_once FCPATH.'/application/libraries/latch/LatchResponse.php'; include_once FCPATH.'/application/libraries/latch/Error.php'; /** * LatchApi Class * * Esta clase gestiona el API de Latch * * @author Fausto López Jara * */ class LatchApi { private $ci = null; private $latch = null; private $optToken = null; private $optGenerated = null; public function __construct() { $this->init();
	}
 
	private function init() {
		//Obtenemos el superobjecto de CodeIgniter (CI)
		$this->ci = & get_instance();
		//Cargar configuración
		$this->load_config();
		if (is_null($this->latch))
			$this->latch = new Latch($this->ci->config->item('appid'),$this->ci->config->item('secret'));
	}
 
	/**
	* Cargar el archivo de configuración de Latch
	*/
	private function load_config() {
		$this->ci->config->load('latch');
		if(!$this->ci->config->item('appid') || !$this->ci->config->item('secret'))
			throw new Exception('No se han configurado los parámetros appid y secret (application/config/latch.php).');
	}
 
	/**
	* Parear cuenta
	* 
	* @param string $token Clave de pareo generada en la app.
	* @return string Devuelve el código de identificación de pareo 
	* o una excepción en caso de error. 
	*/
	public function pair($token){
		//Llamo a la función pair con el código de pareo
		$response = $this->latch->pair($token);
		$data = $response->getData();
		//Si todo ha ido bien devolvemos el código de pareo accountId
		if (!is_null($data) && property_exists($data, "accountId")){
			return $data->accountId;
		}else{
			//Si la API ha devuelto un error lanzó una excepción.
			$error = self::get_property($response,'error');
			if (!is_null($error))
				throw new Exception($error->getMessage(), 1);
			else
				throw new Exception("Error processing request.", 1);			
		}
	}
 
	/**
	* Desparear cuenta
	* 
	* @param string $accountId Código de identificación de pareo.
	*/
	public function unpair($accountId){
		//Llamo a la función unpair con el código de identificación de pareo
		$response = $this->latch->unpair($accountId);
		//Si la API ha devuelto un error lanzó una excepción.
		$error = $response->getError();
		if (!is_null($error))
			throw new Exception($error->getMessage(), 1);
	}
 
	/**
	* Devuelve el estado de una cuenta
	* 
	* @param string $accountId Código de identificación de pareo.
	* @return boolean Devuelve true/false
	*/
	public function status($accountId, $operationId = null){
		//Compruebo el estado de la cuenta latcheada
        $account = $this->latch->status($accountId);
        if ($data = self::get_property($account,'data')){
            //Si el array existe y contiene datos obtengo las operaciones
            $operations = self::get_property($data,'operations');
            //Obtengo la operación mediante su id
            $app = self::get_property($operations,$this->ci->config->item('appid'));
            //Compruebo si tiene segundo factor
            $two_factor = self::get_property($app,'two_factor');
            //Si tiene segundo factor almaceno el token que devuelve
            $this->optToken = self::get_property($two_factor,'token');
            $this->optGenerated = self::get_property($two_factor,'generated');
            //Devuelvo su estado
            $statusApp = filter_var(self::get_property($app,'status'),FILTER_VALIDATE_BOOLEAN);
            return $statusApp;
        }
        return true;
	}
 
	/**
	* Devuelve el elemento de un array si existe
	* 
	* @param string $array Array de datos
	* @property string Propiedad del array
	* @return elemento del array o null
	*/
	private function get_property($array, $property){
		if (!empty($array) && !is_null($array) && property_exists($array, $property)){
			return $array->$property;
		}else{
			return null;
		}
 
	}
 
	/**
     * Get optToken
     *
     * @return string 
     */
	public function get_OptToken(){
		return $this->optToken;
	}
 
	/**
     * Get optGenerated
     *
     * @return string 
     */
	public function get_OptGenerated(){
		return $this->optGenerated;
	}
}

También podéis descargar la librería y el SDK desde este link.

En definitiva…

La implementación de Latch en un proyecto de CodeIgniter es muy sencilla. La documentación existente en la página oficial es muy extensa y clara.

En esta entrada he querido desarrollar una librería básica para facilitar la integración de Latch en este framework. En publicaciones posteriores añadiré más funciones a la librería para trabajar con diferentes operaciones dentro de una aplicación.

Para terminar me gustaría decir que ésta herramienta es una buena opción para añadir una capa de seguridad adicional en favor de la privacidad de los usuarios. Sin embargo, no por ello debemos descuidar otros aspectos tan importantes como la seguridad en el código o usar algoritmos de hasheo de contraseñas seguros como PASSWORD_BCRYPT del que hablaré en el siguiente post.

The following two tabs change content below.

Fausto López

Soy una persona alegre, positiva, en formación continua, responsable e implicado en todo lo que hago. En lo personal soy muy familiar, me encanta bailar, ir al cine y viajar.
Compartir: