Autenticação NextAuth.js com MongoDB
Ahmed Bouchefra10 min read • Published Aug 30, 2024 • Updated Aug 30, 2024
APLICATIVO COMPLETO
Avalie esse Tutorial
NextAuth.js é uma biblioteca de autenticação robusta construída para aplicativos Next.js. O NextAuth.js simplifica a integração de funcionalidades de autenticação e oferece compatibilidade com vários métodos de autenticação, incluindo provedores OAuth (Google, Github etc.), logins por e-mail/senha e muito mais.
Este tutorial mostra como configurar o NextAuth.js para autenticação de usuário com e-mail e senha em seu aplicativo Next.js 14 .
Next-Auth é uma biblioteca de autenticação projetada para aplicativos Next.js especificamente. Simplificando, o Next-Auth facilita a adição de autenticação aos seus aplicativos Next.js. Ele fornece uma integração mais perfeita das funcionalidades de autenticação. O Next-Auth também oferece melhor compatibilidade com outros métodos de autenticação, como provedores OAuth (Google, Github, etc.).
O Next-Auth oferece um conjunto de APIs fáceis de usar e outros componentes que podem lidar com fluxos de autenticação muito complexos. Isso significa que os desenvolvedores podem se concentrar mais na criação de seus aplicativos.
O Next-Auth oferece pronto para uso, segurança de autenticação e gerenciamento de sessão integrado. É apropriado para aplicativos de todos os tamanhos e funciona bem com ambientes de computação de borda e sem servidor. Ele também oferece suporte completo ao Typescript , para uma melhor experiência do desenvolvedor.
Antes de começarmos, certifique-se de ter os seguintes pré-requisitos:
- Node.js v20: Verifique se você tem o Node.js instalado em sua máquina. Você pode baixá-lo do site oficial.
- React e Next.js 14: uma compreensão básica do React e Next.js 14 é útil para este tutorial.
Certifique-se de que o serviço mongodb-community foi iniciado localmente. Como alternativa, você pode usar um MongoDB Atlas clustergratuito para sempre.
Vamos criar um novo projeto Next.js usando o seguinte comando no seu terminal:
Responda às perguntas da seguinte forma:
Após as instruções, create-next-app criará uma pasta com o nome do projeto e instalará as dependências necessárias.
Navegue dentro do seu projeto e instale as seguintes dependências:
O pacote próximo-auth fornece funcionalidades de autenticação para aplicativos Next.js. O pacote próximo-autenticação também oferece suporte integrado para vários fornecedores de autenticação e permite fácil integração com seu aplicativo.
A biblioteca bcryptjs fornece funções para hash de senhas usando o algoritmo bcrypt. É comumente usado para armazenar senhas com segurança em bancos de dados, gerando hashes de senha salgados.
Mongoose é uma biblioteca de modelagem de dados de objetos (ODM) para MongoDB e Node.js. Ele fornece uma solução simples e baseada em esquema para modelar os dados do aplicativo, facilitando o trabalho com bancos de dados MongoDB.
Depois de instalar essas dependências, você terá as ferramentas e bibliotecas necessárias para configurar os recursos de autenticação em seu aplicativo Next.js, integrá-lo ao MongoDB, criptografar senhas com segurança e definir modelos de dados usando o Mongoose.
Depois de instalar as dependências, é hora de conectar ao MongoDB. Crie um arquivo
.env.local
na raiz do seu projeto e adicione sua connection string do MongoDB:Observação: se você estiver se conectando a um cluster do MongoDB Atlas, poderá encontrar sua string de conexão no painel do Atlas.
Crie um arquivo
lib/mongodb.ts
e adicione o seguinte código para conectar a um MongoDB database utilizando o mongoose
:Estamos importando a biblioteca
mongoose
, que é uma biblioteca ODM Node.js popular para o MongoDB. Em seguida, recuperamos o URI MongoDB das variáveis de ambiente. Em seguida, definimos uma função assíncrona denominada connectDB
que se conecta ao MongoDB database utilizando o URI obtido das variáveis de ambiente.Dentro da função
connectDB
, usamos um blocotry...catch
para lidar com quaisquer erros potenciais que podem ocorrer durante o processo de conexão do banco de dados. Dentro do blocotry
, usamos o mongoose.connect()
para estabelecer uma conexão com o MongoDB database utilizando o URI fornecido. Se a conexão for bem-sucedida, resolvemos a promessa com um valor de true
.Se ocorrer algum erro durante o processo de conexão, ele será capturado pelo bloco
catch
. Nesse caso, registramos o erro no console e rejeitamos a promessa com o erro capturado.Em seguida, crie um arquivo
models/User.ts
e comece adicionando as seguintes importações:Adicione a interface do usuário:
Adicione o esquema de usuário:
Isso define um esquema Mongoose para um documento de usuário. O
UserSchema
especifica a estrutura e as regras de validação para dados de usuário armazenados em uma coleção MongoDB.Por fim, exporte o modelo do usuário:
Isso garante que o modelo de usuário seja definido e esteja disponível para uso no aplicativo, recuperando um modelo existente ou criando um novo com base no esquema especificado.
Primeiro, precisamos de uma chave secreta NextAuth. Esta chave secreta é usada para criptografar tokens JWT e dados de sessão. Você pode obtê-lo simplesmente executando este comando em seu terminal e ele gerará uma chave aleatória para você:
Você precisa copiar o segredo para seu arquivo
.env
:Crie um arquivo
lib/auth.ts
e comece adicionando as seguintes importações:Defina um objeto NextAuth options da seguinte maneira:
Na função
authorize()
, adicione o seguinte código:Este código verifica as credenciais do usuário (e-mail e senha) em relação às armazenadas em um MongoDB database. Ele garante que as credenciais fornecidas sejam válidas antes de permitir que o usuário prossiga com a autenticação.
Em seguida, crie um
app/api/auth/[...nextauth]/route.ts
arquivo e adicione o seguinte código:Esse código importa as opções de autenticação de seu módulo, inicializa o manipulador de autenticação usando essas opções e exporta o manipulador a ser usado para solicitações
GET
e POST
nas rotas da API.Em Next.js, uma ação do servidor refere-se a qualquer lógica ou funcionalidade que seja executada no lado do servidor antes de renderizar a página. Isso pode incluir tarefas como buscar dados de uma API externa, acessar um banco de dados ou realizar verificações de autenticação.
Em nosso caso, criaremos uma ação de servidor para registrar usuários. Dentro da raiz do seu projeto, crie um arquivo
actions/register.ts
e comece adicionando as seguintes importações:A diretiva "use server", colocada no início do arquivo, instrui Next.js a tratar a(s) função(ões) como uma ação do servidor. Essa função pode ser chamada a partir de componentes do lado do cliente, mas é executada no servidor.
Exporte uma ação de servidor da seguinte maneira:
A função
register
lida com o processo de registro de um novo usuário conectando-se ao MongoDB database, verificando os endereços de e-mail existentes, fazendo hash das senhas e salvando os dados do usuário no MongoDB database.Após configurar o NextAuth e implementar uma ação de servidor para registro de usuário, a próxima etapa é criar as páginas de login e registro.
Para começar, vamos nos concentrar na página de login. Crie um arquivo denominado
app/login/page.tsx
e comece importando as dependências necessárias:A diretiva
use client
é usada para marcar o componente como código do lado do cliente. Isso significa que o código dentro desse escopo só será executado e estará disponível no ambiente do navegador do usuário, e não no servidor.Defina uma função e exporte-a:
No corpo da função, comece adicionando o seguinte código:
Isso estabelece o gerenciamento de estado para mensagens de erro e acesso ao roteador do lado do cliente.
Adicione a função
handleSubmit()
da seguinte forma:Isso define uma função assíncrona que lida com o envio de formulários para o login do usuário. Ele evita o comportamento padrão do formulário, extrai credenciais de usuário do formulário usando FormData, tenta se conectar usando NextAuth.js, e lida com o login bem-sucedido redirecionando o usuário para a página inicial e com possíveis erros atualizando o estado de erro do componente.
Retorna o seguinte código JSX:
Isso simplesmente cria um formulário que permite aos usuários inserir seu e-mail e senha para autenticação e fornece um link para navegar até a página de registro se ainda não tiverem uma conta.
Veja como é o formulário:
Em seguida, vamos criar a página de registro. Crie um arquivo
app/register/page.tsx
e comece adicionando o seguinte código:Isso cria um componente do lado do cliente que inicializa o estado para tratamento de erros, utiliza o roteador Next.js para navegação e fornece uma referência ao elemento do formulário, que será criado abaixo, usando uma ref.
Adicione a função
handleSubmit()
:Isso define uma função assíncrona denominada
handleSubmit
, que é chamada quando um formulário é enviado. A função lida com o envio do formulário, incluindo a extração dos dados do formulário usando FormData, o registro do usuário chamando a ação do servidor de registro, o tratamento de erros e o redirecionamento do usuário para a página de login após o registro bem-sucedido. Caso contrário, ela define o erro que será exibido.Retorna o seguinte código JSX:
É assim que parece:
Nesta seção, demonstraremos como usar o
SessionProvider
no layout pai para garantir que o gerenciamento de sessão esteja disponível em todo o aplicativo. Recuperaremos o estado de autenticação da sessão e exibiremos dinamicamente um botão "Sign Out" se o usuário estiver autenticado, ou um botão "Sign In" se o usuário não estiver autenticado.Crie um
app/provider.tsx
arquivo e adicione o seguinte código:Atualize o
app/layout.tsx
com o provedor que criamos. Primeiro importe-o:Em seguida, adicione da seguinte forma:
Atualize o arquivo
app/page.tsx
da seguinte maneira:Atualize o arquivo
app/globals.css
para remover o CSS personalizado e manter apenas o seguinte:Você primeiro precisa se registrar a partir desta interface:
Você pode então fazer login a partir desta interface:
Você será redirecionado para a página inicial com o botão “Sign Out”, que aparece somente quando o usuário está logado, e você pode usá-lo para sair do aplicativo:
Neste tutorial, analisamos as etapas para configurar a autenticação NextAuth.js com o MongoDB como banco de dados de back-end. Começamos criando um novo projeto Next.js e instalando as dependências necessárias. Em seguida, estabelecemos uma conexão com o MongoDB usando o Mongoose e definimos um esquema de usuário para estruturar nossos dados de usuário.
Em seguida, configuramos NextAuth.js gerando uma chave secreta, definindo opções de autenticação e implementando a lógica de autorização para verificar as credenciais do usuário em relação ao MongoDB. Também criamos ações de servidor para o registro de usuários, lidando com operações de banco de dados com segurança no lado do servidor.
Depois de configurar a autenticação, criamos páginas de login e registro usando componentes React e as integramos ao NextAuth.js para autenticação. Lidamos com envios de formulários, tratamento de erros e redirecionamento de usuários com base no status da autenticação.
Por fim, atualizamos o layout para incluir um provedor de sessão para gerenciar sessões de usuário e garantir a exibição adequada do status de autenticação na página inicial.
Ao seguir essas etapas, você pode implementar efetivamente a autenticação em seu aplicativo Next.js usando o NextAuth.js e o MongoDB, fornecendo uma experiência segura e contínua para seus usuários e simplificando o processo de configuração da autenticação para desenvolvedores.
Principais comentários nos fóruns
Akash_Mishra1Akash Mishralast month
Swapnil_KotkarSwapnil Kotkaryesterday
@Dvir_Ben_Ishay Hello, I am also facinf exact issue from past 7 days. Failed to figure out this issue. Have you resolved this issue?. Please inform or you can write me at: swapnilkotkar793@gmail.com
este código não está funcionando no modo de produção. está mostrando erro
O erro foi causado pela importação de 'mongoose/dist/browser.umd.js