Habilitar el Google Authenticator (two-factor auth) en tu sitio web


El Google authenticator es una aplicación móvil disponible para iOS, Android y al parecer hasta Blackberry que nos auxilia en la implementación de autenticación a 2 pasos en nuestros sitios web. Varios sitios/apps como Evernote, Outlook y Dropbox (por sólo citar algunos ejemplos) lo tienen implementado para permitirle a sus usuarios proteger con una capa extra de seguridad sus preciadas cuentas. La preguna es: ¿Cómo implementarlo en nuestros propios sitios y apps? Sencillo:

1) Generar user_tokens

El Google Authenticator requiere que tengamos a la mano (por cada usuario en nuestro sitio/app) un token individual único. Este token deberá ser generado a partir de una entropía de 10 bits digeridos en formato hexadecimal y después codificados bajo base32, de dicho proceso lo que nos importa es retornar una string de 16 caracteres que podamos almacenar y utilizar como token perteneciente al usuario. Dicha string deberá ser presentada al usuario en formato de código QR después de generada para que pueda "activar" el enlace entre su cuenta en nuestro sitio y el Google Authenticator utilizando su teléfono. Si tenemos por ejemplo una app/sitio MEAN, dicho requerimiento se puede lograr con el siguiente código:


Nótese que este código está hecho para correr en consola únicamente y en una implementación real querríamos asociar el token con algún usuario de nuestro sitio a nivel base de datos (asegurándonos de que el token generado sea único con respecto al de otros usuarios) y mostrarle el QR con la URL generada en alguna vista para que lo pudiera escanear con el Google Authenticator. Si corremos este código en una consola (después de instalar vía npm los módulos crypto y thirty-two en caso de que no los tengamos), veremos que nos devuelve algo como lo siguiente:


El primer parámetro devuelto es el token del usuario y el segundo es la URL del QR que le mostraremos para que lo escanee con su Google Authenticator. Tomamos nota del token y visitamos la URL generada, abrimos Google Authenticator y añadimos un nuevo sitio mediante QR (lo que nos pedirá escanear el código de la URL), una vez hecho esto el resultado será el siguiente (en el móvil):


El totp_token generado (código de 6 dígitos) expirará cada 30 segundos y se seguirá generando uno nuevo para el usuario mientras tenga la aplicación abierta.

2) Validar accesos

Ahora necesitamos una manera de obtener dicho número a partir del token de usuario que nosotros tenemos para después poder implementar algún tipo de validación de acceso en base al google authenticator... Hacer esto es muy sencillo, sólo necesitamos instalar el módulo notp vía npm y nuestro código resultante (de pruebas) se vería así:


Que al ejecutarlo tras proveer el user_token correcto sacado del output del primer script (teniendo el Google Authenticator abierto para verificar), nos debería soltar un output como este:


Donde el código mostrado debería ser mismo en la pantalla del Google Authenticator en dicho momento.