JWT e microsserviços

jwt

Quando sua aplicação está dividida em microsserviços, há uma necessidade de comunicação entre as várias partes da aplicação. Quando a comunicação é apenas entre os serviços, você pode escolher trocar mensagens de forma síncrona (REST, por exemplo) ou assíncrona (usando filas, ou “queues”, por exemplo). Essa comunicação geralmente fica contida dentro da rede dos servidores, em uma mesma VPC que está isolada do mundo externo.

Mas, é preciso tomar mais cuidado com a segurança quando se trata de serviços disponibilizadas para a rede externa. Uma ferramenta bastante usada atualmente para dar mais segurança é o JWT.

JWT

O JWT (JSON Web Token) é um padrão aberto para troca de informações de forma segura e compacta. As informações de um JWT são confiáveis porque a mensagem é assinada digitalmente (HMAC ou RSA key/pairs). A mensagem é compacta, no formato JSON, e pode ser enviada facilmente pela URL, por um parâmetro de POST, ou no header do HTTP, sem comprometer tanto as requisições. Além disso, o conteúdo do JWT já pode conter informações sobre o usuário, dispensando a necessidade de fazer queries no banco para algumas funcionalidades.

Com isso, o JWT pode ser usado para autenticação, em situações em que um token liberaria o acesso a recursos protegidos, ou; troca de informações, em situações em que é preciso garantir que o conteúdo não foi alterado e as informações não são confidenciais (para informações confidenciais, pode-se usar o JWE, no qual as informações são encriptadas.)

Microsserviços

Vamos dizer que o usuário está logado no serviço A, e o cliente (uma página da sua aplicação, por exemplo) precisa de autenticação para obter um recurso ou realizar alguma ação no microsserviço B (obter alguma informação, fazer download de um arquivo, realizar um POST específico). Para resolver essa situação, você pode ter:

  1. uma camada de apresentação no serviço A que, por trás dos panos, conversará com o microsserviço B, ou;
  2. você pode ter a sessão distribuída entre os serviços com algum cache, ou;
  3. você pode usar um token, como o JWT.

Vou apresentar como funcionaria essa última opção.

  1. O usuário, já autenticado, clica no botão para realizar a ação a ser realizada no Microsserviço B.
  2. O javascript da página pede para o serviço de autenticação um JWT.
  3. O serviço de autenticação sabe qual usuário está logado, cria o JWT com o username e as permissões dele, e com a assinatura digital.
  4. O javascript encaminha, faz o POST ou requisita o recurso de B, passando o JWT junto da requisição.
  5. O microsserviço B verifica o JWT, e vai confiar na origem da requisição porque a assinatura está correta, ou seja, o conteúdo não foi alterado, e foi assinado por uma fonte confiável. Caso o JWT esteja com a assinatura errada, ou o JWT esteja com data inválida ou antiga, ou o usuário não tenha as permissões necessárias, o microsserviço B bloqueia o acesso.

Assim, o microsserviço B não precisa acessar a sessão, não precisa acessar o banco de dados (ou o microsserviço) de usuários, nem precisa ficar escondido atrás de alguma fachada.

Anúncios
Marcado com: , ,
Publicado em Microsserviços

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: