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 (.):

  1. Header (Cabeçalho): Contém as informações sobre o tipo de token e o algoritmo de criptografia utilizado.

  2. Payload (Carga): Contém as declarações (claims) que são os dados que você deseja transmitir, como informações do usuário.

  3. 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:

  1. Instale a biblioteca dotenv para gerenciar variáveis de ambiente:

  2. Crie um arquivo .env na raiz do projeto e adicione a chave secreta:

  3. 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

  1. 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.

  2. 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?