// useSession: verifica se existe uma sessão ativa
const { data: session } = useSession()
// signIn: inicia o processo de login
signIn() // login geral
signIn("google") // login específico com Google
// signOut: encerra a sessão
signOut()
Você pode proteger rotas de duas maneiras:
a. Via Middleware (a nível de rota):
// Bloqueia acesso a rotas não autorizadas
export const config = {
matcher: ["/dashboard/:path*"]
}
b. Via Verificação de Sessão (dentro do componente):
if (!session) {
redirect("/login")
}
Usuário → Clica em Login → NextAuth inicia fluxo →
Provedor (ex: Google) → Autorização → Volta para app →
NextAuth cria sessão → Usuário logado
callbacks: {
// Executado quando sessão é criada/atualizada
async session({ session, user }) {
return session
},
// Executado quando usuário faz login
async signIn({ user, account, profile }) {
return true
},
// Personaliza o JWT
async jwt({ token, user, account }) {
return token
}
}
const { status } = useSession()
// status pode ser:
"loading" // verificando sessão
"authenticated" // usuário logado
"unauthenticated" // usuário não logado
npm install next-auth@latest
Crie um arquivo de configuração em /app/api/auth/[...nextauth]/route.ts:
import NextAuth from "next-auth";
import GoogleProvider from "next-auth/providers/google";
const handler = NextAuth({
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_ID!,
clientSecret: process.env.GOOGLE_SECRET!,
}),
],
});
export { handler as GET, handler as POST };
Crie um arquivo .env.local:
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=sua_chave_secreta_aqui # Você pode gerar usando: openssl rand -base64 32
GOOGLE_ID=seu_google_client_id
GOOGLE_SECRET=seu_google_client_secret
No seu layout raiz (app/layout.tsx):
import { SessionProvider } from "next-auth/react";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html>
<body>
<SessionProvider>{children}</SessionProvider>
</body>
</html>
);
}
'use client'
import { useSession, signIn, signOut } from "next-auth/react";
export default function Component() {
const { data: session } = useSession();
if (session) {
return (
<>
Logado como {session.user?.email} <br />
<button onClick={() => signOut()}>Sair</button>
</>
);
}
return (
<>
Não está logado <br />
<button onClick={() => signIn()}>Entrar</button>
</>
);
}
Crie middleware.ts na raiz do projeto:
export { default } from "next-auth/middleware";
export const config = {
matcher: ["/dashboard/:path*", "/perfil"],
};
import { getServerSession } from "next-auth/next";
export default async function Page() {
const session = await getServerSession();
if (!session) {
// Usuário não está autenticado
return <div>Acesso negado</div>;
}
return <div>Conteúdo protegido</div>;
}
import GithubProvider from "next-auth/providers/github";
const handler = NextAuth({
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_ID!,
clientSecret: process.env.GOOGLE_SECRET!,
}),
GithubProvider({
clientId: process.env.GITHUB_ID!,
clientSecret: process.env.GITHUB_SECRET!,
}),
],
});
useSession em componentes client-sidegetServerSessionErro de NEXTAUTH_SECRET não definido
.env.localErro de callback URL
Sessão não persistindo
Erro de CORS
Problemas com TypeScript