diff --git a/ZITADEL_SETUP.md b/ZITADEL_SETUP.md new file mode 100644 index 0000000..cfbf39c --- /dev/null +++ b/ZITADEL_SETUP.md @@ -0,0 +1,225 @@ +# Zitadel + Next.js App Router Integration Setup + +Guia corporativo atuando como Especialista em Engenharia de Software e DevOps para inicialização do ecossistema Zitadel on-premise (Baremetal/Binário direto) integrado à um ambiente moderno Next.js. + +## Parte 1: Setup do Serviço de Autenticação (Zitadel) + +### 1. Download e Instalação (Binário Oficial) +O Zitadel é distribuído em um binário em Go altamente otimizado. Para ambientes baseados em Linux/MacOS: + +```bash +# Definir a versão alvo +export ZITADEL_VERSION="v2.66.3" # ou a tag latest estável + +# Download macOS (usar darwin_arm64 para Apple Silicon ou darwin_amd64 para Intel) +# Download Linux (usar linux_amd64 ou linux_arm64) +curl -sLO "https://github.com/zitadel/zitadel/releases/download/${ZITADEL_VERSION}/zitadel_Linux_x86_64.tar.gz" + +# Extrair +tar -xvf zitadel_Linux_x86_64.tar.gz + +# Mover binário pro path +sudo mv zitadel /usr/local/bin/ +``` + +### 2. Configuração Básica e Local (Sem TLS / Insecure) +Crie um arquivo `config.yaml` voltado para acoplamento interno. Ele especifica conexões sem segredos e expõe a interface sem demandar certificados TLS para localhost. + +**`config.yaml`**: +```yaml +ExternalSecure: false +Port: 8080 + +# Conexão com sua base PostgreSQL limpa inicializada (Pode ser local/Docker) +Database: + postgres: + Host: localhost + Port: 5432 + Database: zitadel + User: + Username: "postgres" + Password: "your-password" + SSL: + Mode: disable + Admin: + Username: "postgres" + Password: "your-password" + SSL: + Mode: disable +``` + +### 3. Setup e Start +A injeção dos esquemas base e a inicialização do container de autenticação: + +```bash +# 1. Aplicar migrações ao PostgreSQL provisionado +zitadel setup --masterkey "a-32-byte-master-key-must-be-set" --config config.yaml + +# 2. Levantar o Listener HTTP +zitadel start --masterkey "a-32-byte-master-key-must-be-set" --config config.yaml +``` + +*O setup inicial gerará um log contendo as informações do usuário `machine` primário (`zitadel-admin`). Guarde este log/json.* + +### 4. Gerar chaves (Service User \/ Machine Key) +1. Acesse `http://localhost:8080/ui/console`. +2. Vá em **Projects** > (Seu projeto) > **Service Users**. +3. Crie um novo. Confirme. +4. Na página de gerenciar esse Service User, vá em **Keys** e adicione uma nova. +5. Selecione formato **JSON**. Ele fará o download da `machinekey.json`. Guarde esse documento num `secrets/` do Next. + +--- + +## Parte 2: Dashboard Next.js (App Router + Tailwind) + +### 1. Inicializando Projetos +```bash +npx create-next-app@latest admin-dashboard --typescript --tailwind --eslint --app +cd admin-dashboard +npm install @zitadel/nextjs @zitadel/server +``` + +### 2. Middleware de Proteção +Crie um arquivo em `src/middleware.ts` para capturar a sessão sem bloqueios pesados. + +```typescript +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; + +export function middleware(request: NextRequest) { + // A SDK usa os tokens armazenados em cookies. + const hasZitadelCookie = request.cookies.some((c) => c.name.includes("zitadel")); + + if (!hasZitadelCookie && request.nextUrl.pathname.startsWith("/dashboard")) { + return NextResponse.redirect(new URL("/api/auth/signin", request.url)); + } + + return NextResponse.next(); +} + +export const config = { + matcher: ["/dashboard/:path*"], +}; +``` + +### 3. Server Component de Dashboard +Interface estilizada de alto nível para exibição do IAM e profile contextual, injetante de tailwind corporativo de forma nativa e sem `use client`. + +`src/app/dashboard/page.tsx` +```tsx +import { getSession } from '@zitadel/nextjs'; +// A API Wrapper SDK para o client Admin gRPC/REST do Zitadel +import { createZitadelClient } from '@zitadel/server'; +import fs from 'fs/promises'; + +export default async function DashboardPage() { + const session = await getSession(); + + if (!session?.user) { + return
Não autorizado.
; + } + + // 1. Instanciando Client IAM via Machine JSON + const keyFile = await fs.readFile(process.cwd() + '/secrets/machinekey.json', 'utf8'); + const zitadelClient = createZitadelClient({ + token: keyFile, + apiUrl: process.env.ZITADEL_API_URL!, + }); + + // 2. Coletando Orgs + let organizations: any[] = []; + try { + const { orgs } = await zitadelClient.management.listOrgs({}); + organizations = orgs || []; + } catch (error) { + console.error("Falha ao buscar organizações", error); + } + + return ( +Visão Administrativa Zitadel
+{session.user.name}
+{session.user.email}
+