🔐 Integração Clerk Authentication
Implemente autenticação profissional em minutos usando Clerk - a solução mais avançada para autenticação em aplicações Next.js modernas.
Por que isso é importante
Aplicações com autenticação segura aumentam a confiança dos usuários em 78%. Clerk reduz o tempo de implementação de auth em 90% comparado a soluções custom, eliminando 95% dos bugs de segurança. Empresas como Linear, Loom e Raycast confiam no Clerk para proteger milhões de usuários.
Conceitos Importantes para Entender
Authentication vs Authorization:
Authentication verifica identidade (quem você é). Authorization controla acesso (o que pode fazer). Clerk gerencia ambos de forma integrada.
Server-Side Auth:
Clerk funciona tanto no cliente quanto no servidor Next.js, garantindo segurança em Server Components e Route Handlers.
Middleware Pattern:
Intercepta requests antes de chegar às páginas, verificando autenticação e redirecionando usuários não autenticados automaticamente.
Prebuilt Components:
Interface pronta para login, cadastro e gerenciamento de perfil. Totalmente customizável e responsiva.
O que é o Clerk?
🚀 Vantagens do Clerk
- Setup em 10 minutos: Instalação e configuração ultra-rápida
- Multi-provider: Google, GitHub, Discord, Apple, etc.
- UI personalizável: Match perfeito com seu design
- Next.js native: Otimizado para App Router
🔒 Recursos de Segurança
- 2FA nativo: SMS, TOTP, backup codes
- Session management: Controle avançado de sessões
- Rate limiting: Proteção contra ataques
- GDPR compliant: Conformidade automática
Configuração Inicial
🌐 Criando Conta no Clerk
Primeiro passo é criar uma conta gratuita no Clerk Dashboard:
1️⃣ Acessar o Clerk Dashboard
Acesse: https://clerk.com
✅ Clique em "Get Started for Free"
✅ Faça cadastro com GitHub (recomendado)
✅ Confirme email se necessário
2️⃣ Criar Nova Aplicação
✅ Clique em "Add application"
✅ Nome: "Meu Projeto Next.js"
✅ Selecione "Next.js" como framework
✅ Escolha provedores de login (Google + GitHub recomendados)
📱 Configurações da Aplicação
Configure domínios e URLs de redirecionamento:
🏠 Domínios Permitidos
No dashboard, vá em Domains e adicione:
• localhost:3000 (desenvolvimento)
• seu-dominio.com (produção)
🔄 URLs de Redirecionamento
Sign-in URL:/sign-in
Sign-up URL:/sign-up
After sign-in:/dashboard
🔑 Configurar API Keys
Copie as chaves da seção API Keys do dashboard:
📋 Arquivo .env.local
# 🔑 Clerk API Keys
# Copie do dashboard: API Keys > Show API Keys
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
# 🔄 URLs de Redirecionamento
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/dashboard🚨 Segurança Importante
- • NUNCA commite o arquivo .env.local
- • Publishable key é pública (NEXT_PUBLIC_)
- • Secret key deve ser privada (sem NEXT_PUBLIC_)
- • Use keys diferentes para dev/staging/prod
Instalação e Setup
📦 Instalação do Pacote
🚀 Instalar @clerk/nextjs
# 📦 Instalar o pacote oficial do Clerk
npm install @clerk/nextjs
# ✅ Verificar instalação
npm list @clerk/nextjs💡 Por que @clerk/nextjs?
- • Otimizado: Especificamente para Next.js 13+ App Router
- • Server Components: Funciona em componentes de servidor
- • Middleware: Integração nativa com Next.js middleware
- • TypeScript: Tipos incluídos automaticamente
🛡️ Configurar Middleware
O middleware intercepta todas as requests e aplica autenticação:
📄 Criar middleware.ts
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
// 🎯 Definir rotas protegidas
const isProtectedRoute = createRouteMatcher([
'/dashboard(.*)',
'/profile(.*)',
'/settings(.*)',
])
// 🛡️ Aplicar proteção apenas nas rotas necessárias
export default clerkMiddleware(async (auth, req) => {
// 🔒 Proteger rotas específicas
if (isProtectedRoute(req)) await auth.protect()
})
export const config = {
matcher: [
'/((?!_next|[^?]*\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
'/(api|trpc)(.*)',
],
}⚠️ Comportamento Padrão
- • Todas as rotas são públicas por padrão
- • Middleware apenas injeta dados de auth
- • Para proteger rotas, use auth protection
- • Arquivo deve estar na raiz do projeto
🔧 Configurar ClerkProvider
Envolva sua aplicação com o ClerkProvider no layout raiz:
🏗️ Atualizar app/layout.tsx
import { ClerkProvider } from '@clerk/nextjs'
import { Inter } from 'next/font/google'
import './globals.css'
const inter = Inter({ subsets: ['latin'] })
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
// 🔐 ClerkProvider envolve toda a aplicação
<ClerkProvider>
<html lang="pt-BR">
<body className={inter.className}>
{children}
</body>
</html>
</ClerkProvider>
)
}🎨 Adicionar Navegação com Auth
import { ClerkProvider, SignInButton, SignUpButton, SignedIn, SignedOut, UserButton } from '@clerk/nextjs'
export default function RootLayout({ children }) {
return (
<ClerkProvider>
<html lang="pt-BR">
<body>
{/* 🔝 Header com botões de autenticação */}
<header className="border-b p-4">
<div className="container mx-auto flex justify-between items-center">
<h1 className="text-xl font-bold">Minha App</h1>
<div className="flex gap-2">
{/* 👤 Mostrar para usuários não logados */}
<SignedOut>
<SignInButton mode="modal">
<button className="bg-blue-500 text-foreground px-4 py-2 rounded">
Entrar
</button>
</SignInButton>
<SignUpButton mode="modal">
<button className="bg-green-500 text-foreground px-4 py-2 rounded">
Cadastrar
</button>
</SignUpButton>
</SignedOut>
{/* ✅ Mostrar para usuários logados */}
<SignedIn>
<UserButton afterSignOutUrl="/" />
</SignedIn>
</div>
</div>
</header>
{children}
</body>
</html>
</ClerkProvider>
)
}📄 Criar Páginas de Autenticação
Crie páginas dedicadas para sign-in e sign-up:
🔑 Página de Login
import { SignIn } from '@clerk/nextjs'
// 🔑 Página de login usando componente do Clerk
export default function SignInPage() {
return (
<div className="min-h-screen flex items-center justify-center bg-bg-2">
<SignIn
appearance={{
elements: {
formButtonPrimary: 'bg-blue-600 hover:bg-blue-700',
card: 'shadow-xl'
}
}}
/>
</div>
)
}📝 Página de Cadastro
import { SignUp } from '@clerk/nextjs'
// 📝 Página de cadastro usando componente do Clerk
export default function SignUpPage() {
return (
<div className="min-h-screen flex items-center justify-center bg-bg-2">
<SignUp
appearance={{
elements: {
formButtonPrimary: 'bg-green-600 hover:bg-green-700',
card: 'shadow-xl'
}
}}
/>
</div>
)
}🎨 Customização de Aparência
- • appearance prop: Customize cores, fontes, espaçamentos
- • CSS variables: Integre com Tailwind CSS
- • redirectUrl: Para onde ir após autenticação
- • Catch-all routes: [[...sign-in]] para máxima flexibilidade
Protegendo Rotas
Vamos criar uma página protegida que só usuários autenticados podem acessar:
🏠 Dashboard Protegido
import { SignOutButton } from '@clerk/nextjs'
import { auth, currentUser } from '@clerk/nextjs/server'
import { redirect } from 'next/navigation'
// 🛡️ Página protegida - só usuários autenticados
export default async function DashboardPage() {
// 🔍 Verificar se usuário está autenticado
const { userId } = await auth()
// 🚫 Redirecionar se não autenticado
if (!userId) {
redirect('/sign-in')
}
// 👤 Buscar dados do usuário atual
const user = await currentUser()
return (
<div className="container mx-auto p-8">
<div className="bg-white rounded-lg shadow-md p-6">
<h1 className="text-2xl font-bold mb-4">
🎉 Bem-vindo, {user?.firstName}!
</h1>
<div className="grid md:grid-cols-2 gap-6">
<div>
<h3 className="font-semibold mb-2">Informações do Perfil</h3>
<p><strong>Nome:</strong> {user?.fullName}</p>
<p><strong>Email:</strong> {user?.emailAddresses[0]?.emailAddress}</p>
<p><strong>ID:</strong> {user?.id}</p>
</div>
<div>
<h3 className="font-semibold mb-2">Última Atividade</h3>
<p><strong>Último login:</strong> {user?.lastSignInAt?.toString()}</p>
<p><strong>Cadastrado em:</strong> {user?.createdAt?.toString()}</p>
</div>
<SignOutButton/>
</div>
</div>
</div>
)
}🛡️ Middleware com Proteção
import { clerkMiddleware, createRouteMatcher } from '@clerk/nextjs/server'
// 🎯 Definir rotas protegidas
const isProtectedRoute = createRouteMatcher([
'/dashboard(.*)',
'/profile(.*)',
'/settings(.*)',
])
// 🛡️ Aplicar proteção apenas nas rotas necessárias
export default clerkMiddleware((auth, req) => {
// 🔒 Proteger rotas específicas
if (isProtectedRoute(req)) auth().protect()
})
export const config = {
matcher: [
'/((?!_next|[^?]*\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
'/(api|trpc)(.*)',
],
}Testando a Integração
Agora vamos testar se tudo está funcionando corretamente:
🚀 Iniciar Aplicação
# 🚀 Rodar em modo desenvolvimento
npm run dev
# 🌐 Acessar no navegador:
# http://localhost:3000✅ Checklist de Teste
- • Página inicial: Botões "Entrar" e "Cadastrar" visíveis
- • Sign-in: Modal/página de login aparece corretamente
- • Sign-up: Processo de cadastro funciona
- • Dashboard: Redireciona após login bem-sucedido
- • UserButton: Menu do usuário funciona
- • Logout: Limpa sessão e redireciona
- • Proteção: Dashboard inacessível sem login
🐛 Debug e Logs
// 🔍 Debug de autenticação
import { auth, currentUser } from '@clerk/nextjs/server'
export default async function DebugPage() {
const { userId, sessionId } = await auth()
const user = await currentUser()
console.log('Auth Debug:', {
userId,
sessionId,
user: user ? 'Authenticated' : 'Not authenticated'
})
return (
<div className="p-8">
<h1>Debug de Autenticação</h1>
<pre className="bg-bg-2 p-4 rounded">
{JSON.stringify({ userId, sessionId }, null, 2)}
</pre>
</div>
)
}Vantagens desta Implementação
- 🚀 Setup Ultra-Rápido:
Autenticação completa em 10 minutos vs semanas de desenvolvimento custom
- 🔒 Segurança Enterprise:
2FA, rate limiting e conformidade GDPR incluídos
- 🎨 UI Customizável:
Interface adapta-se perfeitamente ao seu design system
- 📱 Multi-Provider:
Google, GitHub, Discord, Apple e mais de 20 provedores
- ⚡ Performance:
Server Components otimizados e middleware eficiente
- 🔧 Manutenção Zero:
Updates de segurança e novos recursos automáticos
O que Você Conquistou
🎉 Parabéns! Você implementou um sistema de autenticação profissional que rivalize com as maiores empresas de tecnologia.
- ✅ Conta Clerk configurada com domínios e redirects
- ✅ Autenticação completa com login/cadastro/logout
- ✅ Proteção de rotas via middleware Next.js
- ✅ UI profissional com componentes customizáveis
- ✅ Multi-provider auth (Google, GitHub, etc.)
- ✅ Server Components com dados de usuário
- ✅ Base escalável para aplicações enterprise