Autenticação - orivaldosantana/mvp_banco_talentos GitHub Wiki

A autenticação é o processo de verificar a identidade de um usuário, sistema ou dispositivo antes de conceder acesso a um sistema. É um dos principais pilares da segurança digital e garante que apenas usuários autorizados possam acessar determinados dados ou realizar certas ações.

NextAuth.js

A biblioteca NextAuth.js, recentemente renomeada para Auth.js, é uma solução popular e flexível para implementar autenticação em aplicações JavaScript, particularmente em projetos desenvolvidos com Next.js. A seguir, explico os principais conceitos, recursos, e como utilizá-la:

O que é NextAuth.js/Auth.js?

NextAuth.js é uma biblioteca de autenticação open-source que facilita a integração de diversos métodos de autenticação em uma aplicação. Ela suporta:

  1. Login via Provedores de Identidade:
    • Google, Facebook, GitHub, Twitter, etc.
  2. Autenticação baseada em credenciais:
    • Login e senha customizados.
  3. Autenticação por e-mail:
    • Magic links (links de login enviados por e-mail).
  4. JWT (JSON Web Tokens):
    • Para sessões sem estado.

Seu maior diferencial é a facilidade de configuração e a integração nativa com o Next.js, aproveitando as rotas dinâmicas e o modelo de API do framework.

Principais recursos

  1. Provedores de autenticação prontos: Conecte-se facilmente a provedores populares como Google, GitHub, etc.
  2. Segurança robusta: Suporte nativo para tokens CSRF, cookies seguros e criptografia de dados sensíveis.
  3. Gerenciamento de sessão: Sessões com suporte a JWT ou persistência no banco de dados.
  4. Integração com bancos de dados: Permite salvar usuários e sessões em bancos como PostgreSQL, MySQL, MongoDB ou até serviços como Prisma.
  5. Customização flexível: Permite definir callbacks e personalizar o comportamento de autenticação.
  6. Serverless ready: Totalmente compatível com ambientes serverless.

Como funciona a autenticação com NextAuth.js?

A autenticação no NextAuth.js é baseada em uma única rota de API: /api/auth/[...nextauth]. Esta rota é gerenciada automaticamente pela biblioteca para lidar com login, logout, callbacks e sessão.

Fluxo Básico

  1. O usuário acessa a página de login e escolhe um método de autenticação (e.g., Google, GitHub, credenciais).
  2. O NextAuth redireciona para o provedor de autenticação ou verifica as credenciais.
  3. Após o login bem-sucedido, uma sessão é criada.
  4. A sessão é acessível no lado do cliente e do servidor.

Fluxo de autenticação com login e senha

O fluxo de autenticação com login e senha usando NextAuth.js é implementado através do provedor de credenciais (Credentials Provider). Este provedor permite criar um sistema de autenticação personalizado onde as credenciais (como e-mail e senha) são validadas por você.

Detalhadamente o fluxo

  1. Usuário preenche o formulário de login:

    • O cliente envia as credenciais (e-mail e senha) para o endpoint de autenticação configurado pelo NextAuth.js.
  2. NextAuth.js processa as credenciais:

    • O CredentialsProvider é utilizado para validar as credenciais recebidas.
    • Você define manualmente como validar o login (geralmente consultando um banco de dados para verificar o e-mail e senha do usuário).
  3. Validação das credenciais:

    • Se as credenciais forem válidas, o usuário é autenticado, e um token JWT (ou sessão) é criado.
    • Se as credenciais forem inválidas, um erro é retornado, informando que o login falhou.
  4. Sessão de autenticação:

    • O NextAuth.js armazena a sessão do usuário (usando cookies ou JWT) para que ele permaneça autenticado durante a navegação.

Vantagens

  • Fácil integração com provedores populares.
  • Configuração mínima para casos simples.
  • Segurança integrada e suporte a tokens JWT.
  • Altamente customizável para atender necessidades complexas.

Desvantagens

  • Depende da API do Next.js, então não é ideal para aplicações fora desse ecossistema.
  • Pode ser excessivo para sistemas muito simples.

OAuth

OAuth (abreviação de Open Authorization) é um protocolo de autorização amplamente usado para permitir que aplicativos acessem recursos em nome de um usuário, sem que o aplicativo precise conhecer ou armazenar diretamente as credenciais (como a senha) do usuário. Ele é utilizado para delegar permissões de acesso de forma segura, permitindo que usuários compartilhem seus dados com aplicativos de terceiros, mas mantendo o controle sobre quais informações podem ser acessadas.

Como funciona o OAuth?

O OAuth funciona como uma "ponte" entre:

  1. O usuário que deseja conceder acesso.
  2. O aplicativo cliente que solicita acesso.
  3. O provedor de identidade (ou servidor OAuth) que controla o acesso aos dados.

Fluxo Básico do OAuth

O fluxo mais comum do OAuth é chamado de Authorization Code Flow. Aqui está o passo a passo básico:

  1. O aplicativo cliente solicita autorização:

    • O usuário é redirecionado para o servidor de autorização (ex.: Google, Facebook).
    • O servidor solicita que o usuário faça login e aprove ou rejeite a solicitação.
  2. O usuário concede ou nega permissão:

    • Se o usuário conceder permissão, o servidor OAuth redireciona o cliente de volta com um código de autorização.
  3. Troca do código por um token:

    • O aplicativo cliente envia o código de autorização de volta ao servidor OAuth para trocar por um token de acesso.
  4. Acesso aos recursos protegidos:

    • Com o token de acesso, o aplicativo cliente pode fazer solicitações autenticadas ao servidor de recursos para acessar dados do usuário (como e-mails, perfil, etc.).

Principais componentes do OAuth

  1. Resource Owner (Proprietário do Recurso):

    • O usuário final que controla o acesso aos seus dados.
  2. Client (Cliente):

    • O aplicativo que solicita acesso aos dados do usuário (ex.: um aplicativo que permite login com Google).
  3. Authorization Server (Servidor de Autorização):

    • O serviço que autentica o usuário e emite tokens de autorização (ex.: servidores do Google, Facebook, etc.).
  4. Resource Server (Servidor de Recursos):

    • O serviço onde os dados protegidos do usuário estão armazenados (ex.: API do Google Drive ou Facebook).
  5. Access Token (Token de Acesso):

    • Um token temporário que o cliente usa para acessar os dados do usuário.

Exemplo Prático

Um exemplo comum de OAuth é o botão "Login com Google" em sites ou aplicativos.

  1. Você clica no botão "Login com Google".
  2. O aplicativo redireciona você para o Google, onde você faz login e concede permissão para acessar seu nome, e-mail e foto de perfil.
  3. O Google emite um token de acesso para o aplicativo.
  4. O aplicativo usa esse token para obter suas informações (nome, e-mail, etc.) sem nunca ter acesso à sua senha do Google.

Referência