Tokens e Segurança
Introdução aos Tokens
Após implementar a autenticação básica, é fundamental garantir a segurança e a eficiência na gestão das sessões dos usuários. Para isso, utilizamos tokens, que são chaves de acesso que permitem aos usuários interagirem com a aplicação de maneira segura.
O que é um Token?
Um token é uma sequência de caracteres que atua como uma chave de acesso. Ele deve ser único, seguro e difícil de adivinhar, podendo ser gerado de forma aleatória ou por meio de algoritmos de hash. Os tokens são amplamente utilizados para:
Autorizar Acessos: Garantir que apenas usuários autenticados possam acessar certas rotas ou funcionalidades.
Manter Sessões: Manter o usuário autenticado durante a navegação na aplicação sem a necessidade de reautenticação constante.
Realizar Transações Seguras: Autorizar operações sensíveis, como transações financeiras.
Exemplos de Uso de Tokens
Aplicativos Bancários: Geram tokens para autorizar transações seguras.
Redes Sociais: Mantêm o usuário autenticado durante a navegação.
Autenticação em Duas Etapas (2FA): Geram códigos temporários para confirmar logins.
Carteirinha de Estudante: Utilizam tokens para acesso em universidades ou escolas.
JWT (JSON Web Token)
O JWT (JSON Web Token) é um padrão amplamente utilizado para a autenticação em serviços web. Ele permite o envio seguro de informações entre as partes como um objeto JSON, que pode ser verificado e confiável graças à sua assinatura digital.
Estrutura do JWT
Um JWT é composto por três partes, separadas por pontos (.
):
Header (Cabeçalho): Contém as informações sobre o tipo de token e o algoritmo de criptografia utilizado.
Payload (Carga): Contém as declarações (claims) que são os dados que você deseja transmitir, como informações do usuário.
Signature (Assinatura): Garante que o token não foi alterado. É gerada a partir do header, payload e uma chave secreta.
Exemplo de JWT:
Recursos Úteis
JWT.io Debugger: Ferramenta online para decodificar, verificar e depurar tokens JWT. Acessar JWT.io
Implementação do JWT
Vamos implementar a autenticação utilizando JWT no nosso projeto Node.js, garantindo que apenas usuários autenticados possam acessar rotas protegidas.
1. Instalação da Biblioteca jsonwebtoken
Primeiramente, instale a biblioteca jsonwebtoken
, que nos permitirá gerar e verificar tokens JWT.
2. Configuração das Chaves Secretas
Crie um arquivo de configuração para armazenar a chave secreta utilizada para assinar os tokens. Essa chave NUNCA DEVE estar exposta no código. Utilizaremos variáveis de ambiente para mantê-la segura.
Passos:
Instale a biblioteca dotenv para gerenciar variáveis de ambiente:
Crie um arquivo
.env
na raiz do projeto e adicione a chave secreta:Atualize o arquivo
index.js
para carregar as variáveis de ambiente:
3. Geração e Validação de Tokens
Crie um serviço para gerenciar a geração e a validação dos tokens JWT.
4. Atualização do Service de Autenticação
Atualize o serviço de autenticação para utilizar o token JWT ao realizar o login.
5. Atualização do Controller de Autenticação
Atualize o controller para retornar o token JWT ao realizar o login.
6. Implementação do Middleware de Autenticação
Crie um middleware para proteger as rotas, verificando se a requisição possui um token válido.
7. Protegendo Rotas com Middleware
Utilize o middleware de autenticação para proteger rotas que requerem usuário autenticado.
Fluxo de Autenticação com JWT
Cadastro de Usuário:
O usuário envia seus dados para o endpoint
/auth/cadastro
.A senha é criptografada utilizando bcrypt.
Os dados do usuário são armazenados no banco de dados sem gerar um token.
Login:
O usuário envia suas credenciais para o endpoint
/auth/login
.As credenciais são verificadas e, se válidas, um token JWT é gerado e retornado.
O token deve ser armazenado no cliente (por exemplo, no
localStorage
) e enviado nas requisições subsequentes nas headers para acessar rotas protegidas.
Exemplo Prático de Cadastro e Login
Cadastro de Usuário:
Endpoint:
POST /auth/cadastro
Corpo da Requisição:
Resposta:
Login de Usuário:
Endpoint:
POST /auth/login
Corpo da Requisição:
Resposta:
Last updated
Was this helpful?