Este documento descreve a arquitetura, as melhores práticas e os passos de integração do Auth0 como mecanismo de autenticação e autorização para todo o portfólio de aplicações (internas e externas) da empresa.
- Auth0 como Provedor de Identidade (IDP): Será responsável pela autenticação (AuthN) e autorização (AuthZ) centralizadas.
- Tenants Separados:
- Tenant Corporativo: para aplicações internas e SSO de funcionários.
- Tenant de Clientes: para a SaaS LIS, isolando dados e configurações de segurança.
- Universal Login: Uso do Universal Login customizado para garantir experiência única e marca consistente.
- API Gateway de Autenticação: Camada intermediária que expõe apenas as operações necessárias (login, refresh, gestão de usuários, atribuição de roles) e valida tokens.
-
Obter Credenciais
- Solicite acesso ao tenant apropriado (Corporativo ou SaaS)
- Obtenha seu
CLIENT_IDeCLIENT_SECRET - Obtenha a URL do Auth Gateway para seu ambiente
-
Integração Básica (3 minutos)
// 1. Adicionar middleware de autenticação à sua aplicação app.use("*", async (c, next) => { const AUTH_GATEWAY_URL = config.authGateway.url; if (!AUTH_GATEWAY_URL) { console.warn("AUTH_GATEWAY_URL não definida, pulando autenticação"); await next(); return; } // 2. Encaminhar cookies para autenticação central const cookieHeader = c.req.header("Cookie") || ""; const introspectRes = await fetch(`${AUTH_GATEWAY_URL}/api/introspect`, { headers: { Cookie: cookieHeader } }); // 3. Tratar resposta não autorizada if (!introspectRes.ok) { return c.redirect(`${AUTH_GATEWAY_URL}/login?return_to=${c.req.url}`); } // 4. Obter informações do usuário const data = await introspectRes.json(); c.set("user", data.user); await next(); });
-
Teste
- Acesse sua aplicação
- Você deve ser redirecionado para o login central
- Após o login, você voltará à sua aplicação com as informações de usuário
-
Manipulação de Cookies
- Garanta que os cookies estejam sendo encaminhados corretamente
- Verifique as configurações SameSite e Secure dos cookies
- Confirme se a configuração de domínio está correta
-
Problemas de CORS
- Adicione o domínio do Auth Gateway à lista de permissões CORS
- Garanta que as credenciais sejam incluídas nas requisições CORS
- Verifique se o domínio da sua aplicação está registrado no Auth Gateway
-
Expiração de Token
- Trate as respostas 401 adequadamente
- Implemente refresh silencioso quando possível
- Não armazene tokens em localStorage
-
Nunca:
- Armazenar tokens em localStorage
- Registrar tokens ou credenciais de usuário
- Desabilitar SSL/TLS
- Compartilhar CLIENT_SECRET no código frontend
-
Sempre:
- Usar variáveis de ambiente para dados sensíveis
- Implementar tratamento de erros adequado
- Configurar flags de segurança dos cookies adequadamente
- Manter dependências atualizadas
| Problema | Verificar |
|---|---|
| 401 Não Autorizado | - CLIENT_ID/SECRET válidos - Expiração de token - Encaminhamento de cookies correto |
| Erros de CORS | - Origens permitidas no Auth Gateway - Modo de credenciais nas requisições fetch |
| Redirecionamentos infinitos | - Configurações de cookies - Configuração de domínio - Configurações de SSL/TLS |
| Tenant | Finalidade | Domínio Customizado |
|---|---|---|
| Corporativo | Aplicações internas e SSO | auth.empresa.com |
| Clientes (SaaS LIS) | Clientes externos da SaaS | auth.lis.empresa.com |
- O cliente (SPA, Mobile, .NET, etc.) redireciona o usuário para o Universal Login.
- Auth0 autentica e decide em qual tenant operar (baseado em domínio, parâmetros ou subdomínio).
- O Auth0 retorna o ID Token e o Access Token ao cliente.
- O cliente inclui o Access Token nas requisições ao API Gateway.
- O Gateway valida o token (verifica assinatura, expiração, escopos e roles).
- O Gateway aplica RBAC via middleware e encaminha a chamada aos microserviços.
- EndPoints Expostos:
/login: inicia fluxo OIDC (redirect)./logout: encerra a sessão./refresh: renova tokens (refresh tokens rotativos)./users: criação, atualização, remoção de usuários./roles: atribuição e remoção de roles./api/introspect: introspecção de tokens; retorna{ active, client_id, user { id, name, email, isAdmin, role }, exp, iat }.
- Responsabilidades:
- Encapsular a Management API do Auth0.
- Aplicar políticas de segurança (rate limit, CORS, etc.).
- Fornecer SDK cliente leve (JS/TS, .NET, etc.) para integração.
O serviço requer as seguintes variáveis de ambiente (exemplo: arquivo .env):
AUTH0_DOMAIN: domínio Auth0 (ex.:dev-ulp8mj8hsi4j2ofh.us.auth0.com)AUTH0_CLIENT_ID: Client ID da aplicação OIDC.AUTH0_CLIENT_SECRET: Client Secret da aplicação OIDC.AUTH0_CALLBACK_URL: URL de callback registrada no Auth0 (ex.:http://localhost:8000/api/callback).AUTH0_LOGOUT_REDIRECT: URL de redirecionamento após logout.AUTH0_MGMT_CLIENT_ID: Client ID do aplicativo Machine-to-Machine para Management API.AUTH0_MGMT_CLIENT_SECRET: Client Secret do aplicativo Machine-to-Machine.
Para facilitar a configuração, você pode usar o seguinte padrão (exemplo no arquivo .env):
# Obrigatórias
AUTH_GATEWAY_URL=https://auth.company.com # Base URL da camada de autenticação
CLIENT_ID=your_client_id # Do painel Auth0
CLIENT_SECRET=your_client_secret # Do painel Auth0
# Opcionais
AUTH_COOKIE_NAME=session # Padrão: 'session'
AUTH_COOKIE_DOMAIN=.company.com # Padrão: domínio atual
AUTH_COOKIE_SECURE=true # Padrão: true em produçãoImportante: Para que o cookie de sessão (
session) seja enviado corretamente em todos os subdomínios de.iliberty.com.br(por exemplomockapi.iliberty.com.br,iprojectmanager.iliberty.com.br), defina o atributoDomaindo cookie como.iliberty.com.breSameSite=None. Caso contrário, o navegador não enviará o cookie em cenários cross-site, resultando em redirecionamentos infinitos.
Endpoint para validar tokens de sessão (cookie HTTP-only session ou header Authorization: Bearer <token>). Use /api/introspect. Retorna JSON:
{
"active": true,
"client_id": "RXK7W9x8t0bnfwjkJlmbpGrfjqLqvyGL",
"user": {
"id": "auth0|682b510ab01795ddd5095437",
"name": "william@iliberty.com.br",
"email": "william@iliberty.com.br",
"isAdmin": true,
"role": "admin"
},
"exp": 1748051931,
"iat": 1748015931
}- Se o token não estiver presente ou inválido: retornará
401com{ "active": false, "error": "..." }.
import createAuth0Client from '@auth0/auth0-spa-js';
const auth0 = await createAuth0Client({
domain: 'auth.empresa.com',
client_id: 'CLIENT_ID',
redirect_uri: window.location.origin,
audience: 'API_GATEWAY_AUDIENCE',
});
// Exemplo de login
await auth0.loginWithRedirect();
// Após callback, obtém token silenciosamente
const token = await auth0.getTokenSilently();builder.Services.AddAuth0WebAppAuthentication(options => {
options.Domain = "auth.empresa.com";
options.ClientId = Configuration["Auth0:ClientId"];
options.ClientSecret = Configuration["Auth0:ClientSecret"];
options.Scope = "openid profile email";
});
// Protegendo APIs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options => {
options.Authority = "https://auth.empresa.com/";
options.Audience = "API_GATEWAY_AUDIENCE";
});- Access Tokens Curto Prazo: 5-15 minutos.
- Refresh Tokens Rotativos: habilitar Refresh Token Rotation.
- Armazenamento Seguro: usar cookies HTTP-only e same-site=strict ou storage seguro.
- Timeouts: configurar idle timeout e absolute timeout no Auth0.
- Definir Roles e Permissões no painel do Auth0.
- Incluir claims de roles em
app_metadata.rolesno ID/Access Token. - No Gateway, usar middleware para verificar roles antes de permitir o acesso.
- MFA: obrigatório para contas administrativas.
- Actions: personalizar o fluxo (ex.: adicionar claims, sincronizar dados).
- Logs e Monitoramento: configurar alertas e Webhooks.
Para visualizar o diagrama de arquitetura, veja
docs/auth_architecture.mmd.
Nesta interface de administração, você pode gerenciar as aplicações internas que consumirão nosso sistema de autenticação central:
- Acessar o menu "Apps": no menu principal, clique em "Apps" para ver a lista de aplicações registradas.
- Criar Novo App: informe o nome da aplicação, uma descrição opcional e as URLs de callback (separadas por vírgula). O sistema criará um
Client IDe umClient Secret. - Visualizar Credenciais: após a criação, será exibido o
Client Secretapenas uma vez. Guarde-o em local seguro. - Editar App: atualize nome, descrição ou URLs de callback.
- Excluir App: remova o acesso de uma aplicação, invalidando seu
Client IDeClient Secret.
import { Hono } from "hono/mod.ts";
const app = new Hono();
app.get("/login", (c) => {
// Redireciona para o provedor de autenticação central, passando return_to
const redirectTo = encodeURIComponent("https://minha-app-frontend.com/callback");
return c.redirect(`/login?return_to=${redirectTo}`);
});
app.get("/callback", async (c) => {
// Após o callback, o usuário será redirecionado de volta ao URL configurado em return_to
return c.text("Autenticado com sucesso!");
});<button
hx-get="/login?return_to=https://minha-app-frontend.com/callback"
hx-swap="none"
>
Entrar na Minha App
</button>Nota: Em suas aplicações, use sempre o
Client IDcadastrado e configure o callback no provedor de autenticação para corresponder à URL utilizada.