APRENDIZADO & COGNIÇÃO

Autenticação Completa no Next.js com NextAuth.js e Middleware

O erro que abre a porta: rotas desprotegidas no App Router A configuração padrão do NextAuth.js protege exatamente zero rotas.…

O erro que abre a porta: rotas desprotegidas no App Router

A configuração padrão do NextAuth.js protege exatamente zero rotas. Você instala, configura o provider, faz login funcionar na tela e assume que o resto está seguro. Não está. Qualquer rota server-side ou API route continua acessível sem sessão até que você adicione verificação explícita em cada handler ou configure o middleware corretamente.

Esse post monta uma autenticação completa: configuração do NextAuth.js v5 (Auth.js) no App Router, provider OAuth (GitHub) e credentials, sessão JWT, middleware que protege rotas na edge e callbacks que controlam o que vai no token. O resultado é uma base que você copia, adapta o provider e tem proteção real.

Estrutura do projeto e dependências

Antes de qualquer código, instale o necessário:

npm install next-auth@beta @auth/prisma-adapter @prisma/client prisma bcryptjsnpm install -D @types/bcryptjs

A versão next-auth@beta é o Auth.js v5, que suporta App Router nativamente. Se você ainda usa Pages Router, a API é diferente. Este post assume App Router com Next.js 14+.

A estrutura de arquivos que vamos construir:

src/├── auth.ts # Configuração central do NextAuth├── middleware.ts # Proteção de rotas na edge├── app/│ ├── api/auth/[...nextauth]/route.ts│ ├── (protected)/│ │ └── dashboard/page.tsx│ ├── login/page.tsx│ └── layout.tsx├── lib/│ └── db.ts # Instância do Prisma└── components/ └── session-provider.tsx

Configuração central do NextAuth.js v5

O arquivo auth.ts na raiz do src é o ponto central. Tudo parte daqui:

// src/auth.tsimport NextAuth from "next-auth";import GitHub from "next-auth/providers/github";import Credentials from "next-auth/providers/credentials";import { PrismaAdapter } from "@auth/prisma-adapter";import bcrypt from "bcryptjs";import { db } from "@/lib/db";export const { handlers, signIn, signOut, auth } = NextAuth({ adapter: PrismaAdapter(db), // JWT porque o middleware roda na edge e não tem acesso ao banco session: { strategy: "jwt" }, pages: { signIn: "/login", error: "/login", }, providers: [ GitHub({ clientId: process.env.GITHUB_CLIENT_ID!, clientSecret: process.env.GITHUB_CLIENT_SECRET!, }), Credentials({ name: "credentials", credentials: { email: { label: "Email", type: "email" }, password: { label: "Senha", type: "password" }, }, async authorize(credentials) { if (!credentials?.email || !credentials?.password) return null; const user = await db.user.findUnique({ where: { email: credentials.email as string }, }); if (!user || !user.hashedPassword) return null; const passwordMatch = await bcrypt.compare( credentials.password as string, user.hashedPassword ); if (!passwordMatch) return null; // Retorne apenas o que o NextAuth precisa para montar o token return { id: user.id, email: user.email, name: user.name, role: user.role, }; }, }), ], callbacks: { // Injeta dados customizados no JWT async jwt({ token, user }) { if (user) { token.role = user.role; token.id = user.id; } return token; }, // Expõe dados do JWT na sessão do client async session({ session, token }) { if (session.user) { session.user.role = token.role as string; session.user.id = token.id as string; } return session; }, // Controla redirecionamento pós-login async authorized({ auth, request: { nextUrl } }) { const isLoggedIn = !!auth?.user; const isOnDashboard = nextUrl.pathname.startsWith("/dashboard"); if (isOnDashboard && !isLoggedIn) { return Response.redirect(new URL("/login", nextUrl)); } return true; }, },---Leia o artigo completo em [https://www.vivodecodigo.com.br/nextjs/nextjs-autenticacao-nextauth-middleware-app-router](https://www.vivodecodigo.com.br/nextjs/nextjs-autenticacao-nextauth-middleware-app-router)

Perguntas frequentes

Respostas institucionais sobre esta cobertura, fontes e limites editoriais.

Sobre o que trata “Autenticação Completa no Next.js com NextAuth.js e Middleware”?
O erro que abre a porta: rotas desprotegidas no App RouterA configuração padrão do NextAuth.js protege exatamente zero rotas. Você instala, configura o provider, faz login funcionar na tela e assume que o resto está seguro.…
O que a matéria explica sobre “O erro que abre a porta: rotas desprotegidas no App Router”?
A configuração padrão do NextAuth.js protege exatamente zero rotas. Você instala, configura o provider, faz login funcionar na tela e assume que o resto está seguro. Não está. Qualquer rota server-side ou API route continua acessível sem sessão até que você adicione…
O que a matéria explica sobre “Estrutura do projeto e dependências”?
Antes de qualquer código, instale o necessário:npm install next-auth@beta @auth/prisma-adapter @prisma/client prisma bcryptjsnpm install -D @types/bcryptjsA versão next-auth@beta é o Auth.js v5, que suporta App Router nativamente. Se você ainda usa Pages Router, a API é diferente. Este post assume App Router…
O que a matéria explica sobre “Configuração central do NextAuth.js v5”?
O arquivo auth.ts na raiz do src é o ponto central. Tudo parte daqui:// src/auth.tsimport NextAuth from "next-auth";import GitHub from "next-auth/providers/github";import Credentials from "next-auth/providers/credentials";import { PrismaAdapter } from "@auth/prisma-adapter";import bcrypt from "bcryptjs";import { db } from "@/lib/db";export const { handlers, signIn, signOut,…
Quem edita o conteúdo do Estrato Mente?
A cobertura é produzida e revisada pela equipe editorial do Estrato Mente, com editor-chefe responsável pela linha editorial. Conheça a redação em https://mente.estrato.cc/equipe/.
Quais fontes o Estrato prioriza?
Priorizamos fontes primárias (órgãos oficiais, balanços, estudos revisados, documentos públicos) e cruzamos informações antes da publicação, conforme a política editorial.
Como solicitar correção de uma matéria?
Envie o pedido pela página de Correções (https://mente.estrato.cc/correcoes/) ou Contato (https://mente.estrato.cc/contato/). Erros materiais são corrigidos com registro da atualização.
O conteúdo constitui aconselhamento profissional?
Não. As matérias têm caráter informativo e jornalístico. Decisões financeiras, de saúde, jurídicas ou educacionais devem considerar profissionais habilitados e a sua situação particular.
WhatsApp X LinkedIn
Compartilhar: LinkedIn
Elena Prado

Elena Prado

Elena Prado integra a equipe editorial do Estrato Mente, vertical da rede Estrato, na função de Repórter de Neurociência. O escopo permanente de cobertura inclui sono, cérebro e performance, com atenção ao leitor brasileiro que busca contexto factual, datas oficiais e implicações práticas. Na produção diária, prioriza fontes primárias (órgãos públicos, balanços, papers e documentos oficiais), cruza pelo menos duas referências independentes quando o tema é contestado e evita manchetes que prometam certeza onde há incerteza. Critérios de qualidade: lead com o fato principal, atribuição clara de autoria da equipe Estrato, atualização com selo quando há mudança material e linguagem acessível sem simplificar demais o risco ou o contexto. Trabalha sob revisão da mesa editorial e do editor-chefe do portal. Matérias YMYL recebem segunda leitura antes da publicação e podem ser atualizadas quando surgem novos dados oficiais. Limites: este perfil descreve o papel editorial na marca Estrato. O conteúdo publicado é informativo e não constitui aconselhamento médico, financeiro, jurídico ou profissional personalizado. Transparência ao leitor: metodologia em /metodologia/, ética em /etica-editorial/, correções em /correcoes/, equipe em /equipe/ e canal em /contato/ ([email protected]). Na página-mãe da rede, a bio ampliada e o arquivo de matérias ficam em estrato.cc/blog/, com link para o arquivo do autor em cada portal.

Deixe um comentário