No description
- TypeScript 86.9%
- CSS 11.4%
- JavaScript 1.7%
| public | ||
| src | ||
| .env.example | ||
| .gitignore | ||
| components.json | ||
| eslint.config.mjs | ||
| next.config.ts | ||
| package-lock.json | ||
| package.json | ||
| postcss.config.mjs | ||
| README.md | ||
| tsconfig.json | ||
Tutorial para autenticação em uma API REST JWT com Nextjs 15 e Next-auth
Criar o projeto Nextjs 15:
npx create-next-app@15 intro-next-auth
Instalar next-auth:
npm install next-auth
Gerar o secret no arquivo .env.local:
npx auth secret
Configurar o .env.local:
AUTH_SECRET=""
NEXTAUTH_SECRET=""
# Para uso em Client Side
NEXT_PUBLIC_API_URL=https://rad3-api.app.fslab.dev
# Para uso em Server Side (em produção deve ser o nome do container)
API_URL_SERVER_SIDED=https://rad3-api.app.fslab.dev
O arquivo app/auth/[...nextauth]/route.ts é responsável pela autenticação (usa o Server Side).
Tela de login: app/(no-auth)/login/page.tsx:
- O usuário acessa
/logine preenche SIAPE e senha. - O formulário chama
signIn("credentials", ...)do NextAuth, que faz POST para a API/logindefinida emAPI_URL_SERVER_SIDED. - Se as credenciais estiverem corretas, o backend retorna os dados do usuário e um token JWT.
- O NextAuth salva os dados no token JWT e compartilha via contexto de sessão.
- O usuário é redirecionado para
/dashboard. - Para sair, basta usar
signOute retorna para/login. - Veja
src/types/next-auth.d.tspara o tipo do retorno do usuário completo.
Exemplo de logout (pode ser usado no menu, por exemplo):
useEffect(() => {
signOut({ callbackUrl: "/login" });
}, []);
Crie pastas src/app/(auth)/... para páginas protegidas e src/app/(no-auth)/... para páginas não protegidas.
As páginas que estão em src/app/(auth)/... serão protegidas a partir do src/app/(auth)/layout.tsx.
As páginas que estão em src/app/(no-auth)/... serão de acesso público e não precisam de proteção.
Crie o componente SessionWrapper (components/SessionWrapper.tsx) para compartilhar sessão, use-o no arquivo src/app/layout.tsx, assim todas as páginas podem ter acesso aos dados da sessão.
Exemplo de captura de dados da sessão:
import { useSession } from "next-auth/react";
export default function DashboardPage() {
const { data: session } = useSession();
return <div>Bem-vindo, {session?.user?.nome}!</div>;
}
Crie um arquivo centralizado para as requisições, com configuração opcional para uso do token da sessão. O exemplo está em src/lib/fetchData.ts. Em src/app/(auth)/dashboard/page.tsx temos um exemplo de uso.
Lidando com Refresh token
O exemplo já lida com refresh token. Ao capturar dados da sessão com useSession() o Next-auth verifica se o acesstoken é válido, e caso contrário faz a renovação.
Dicas
- Use o Toast para feedback de login/logout.
- Use um componente de loading para indicar o carregamento de dados e páginas.
- Consulte o arquivo
app/auth/[...nextauth]/route.tsesrc/types/next-auth.d.tspara ajustar os campos do usuário conforme sua API.