Fork me on GitHub

Alan Hoffmeister

Paul Laros

Autenticação de dois fatores no Node.js

Não é mais tão complicado implementar um sistema de autenticação de dois fatores, e usando ferramentas práticas não irá custar nenhum centavo a mais no seu cartão de crédito para deixar os seus usuários (e seu sistema) mais seguros.

Para quem ainda não conhece, a autenticação de dois fatores (2FA) nada mais é do que um login que necessita uma informação adicional à senha do usuário. Alguns sistemas, como o Google por exemplo, podem enviar uma senha ao celular do usuário e pedir que que o mesmo digite os caracteres recebidos. O problema com o método de SMS é que pode sair caro para algumas empresas, ainda mais com o dólar em seu estado atual.

TOTP pode ser a salvação

Um mecanismo muito inteligente e muito fácil de implementar são as chamadas One Time Passwords, que nada mais é do que um hash simples gerado a partir de uma chave secreta compartilhada. Neste post vamos focar em uma derivação do OTP chamada TOTP, a diferença entre o algorítmo OTP é que nesta derivação acrescentamos o Unix Epoc, que é uma medida de tempo. Assim podemos automaticamente gerar uma senha sincronizada com todos que possuem a chave secreta e um relógio sincronizado, esta senha também pode expirar automaticamente dentro de um intervalo de tempo pré estabelecido.

Além de ter uma implementação mais rápida e barata que o envio de SMS, o TOTP também conta com aplicativos mobile gratuitos para que os usuários gerenciem suas senhas descartáveis entre todos os sites que possuem esta funcionalidade habilitada, o aplicativo que usaremos aqui é o Google Autenticator.

Mão na massa

Não basta ler um monte de informações e não aplicar na prática, hoje vamos utilizar o aplicativo Google Autenticator e o pacote speakeasy do Node.js, essas duas ferramentas conseguem gerar as TOTPs a partir de uma chave secreta. Não esqueça que o seu aparelho de celular e o seu computador precisam estar com os relógios sincronizados, o que é 99,9% dos casos, mesmo assim vale o aviso :-)

var speakeasy = require('speakeasy');

// Vamos gerar uma chave secreta e um link para que o usuário possa
// escanear o QR code e fazer o setup da TOTP no seu device
var secret = speakeasy.generate_key({
  google_auth_qr: true // Avisa o speakeasy que queremos um QRCode também
});

console.log('Acesse este link e escaneie o QRCode com o Google Authenticator:\n%s', secret.google_auth_qr);

// Neste exemplo, vamo apenas mostrar na tela o código
// gerado, ele deve bater com o código gerado pelo seu aparelho
var codigo = null;

setInterval(function() {

  // Com apenas um comando podemos gerar a senha TOTP, basta utilizar
  // a mesma chave secreta gerada anteriormente
  var totp = speakeasy.totp({
    key: secret.ascii
  });

  // Cada vez que nossa senha alterar, mostramos na tela
  if (totp !== codigo)
    console.log('Sua nova senha é: %s', totp);

  codigo = totp;
}, 100);

Se você continuar olhando o seu terminar, verá que sua senha troca a cada 30 segundos, o mesmo também irá acontecer no seu Google Authenticator caso você tenha feito o setup usando o QRCode.

Agora não faltam mais motivos para você implementar uma autenticação de dois fatores segura, robusta e barata em seu sistema, seus usuários agradecerão :-)

Primeira conferência de Node.js da América Latina!

Durante os dias 4 e 5 de julho acontecerá a primeira conferência de Node.js da América Latina! Quer conhecer essa plataforma, aprender um pouco mais ou até aprimorar seus conhecimentos? Venha para São Paulo e participe desta edição história da NodeConf.