Pular para conteúdo

API: Autenticação

Visão Geral

Autenticação via JWT (JSON Web Token). O token deve ser enviado no header Authorization: Bearer {token} em todas as requisições autenticadas.

Endpoints

POST /api/auth/login

Autentica um usuário e retorna o token JWT.

Request:

{
  "email": "usuario@exemplo.com",
  "password": "senha123"
}

Response (200 OK):

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "email": "usuario@exemplo.com",
  "name": "Nome do Usuário",
  "role": "Admin",
  "tenantId": "550e8400-e29b-41d4-a716-446655440000",
  "mustChangePassword": false
}

Erros:

Status Código Descrição
401 UNAUTHORIZED Credenciais inválidas
403 FORBIDDEN Conta inativa

Estrutura do Token JWT

Claims

Claim Descrição
sub ID do usuário (Guid)
email Email do usuário
name Nome do usuário
role Role do usuário (SuperAdmin, Admin, User)
tenant_id ID do tenant (ausente para SuperAdmin)
jti ID único do token
exp Data de expiração

Exemplo de Payload Decodificado

{
  "sub": "550e8400-e29b-41d4-a716-446655440000",
  "email": "admin@empresa.com",
  "name": "Admin Empresa",
  "role": "Admin",
  "tenant_id": "660e8400-e29b-41d4-a716-446655440001",
  "jti": "770e8400-e29b-41d4-a716-446655440002",
  "exp": 1703199600
}

Roles

Role Descrição TenantId
SuperAdmin Acesso global a todos os tenants null
Admin Gerencia recursos do próprio tenant presente
User (Atendente) Visualização + conversas no tenant presente

Constantes: Roles estão centralizadas em Ciba.Shared/Constants/AuthConstants.cs e devem ser usadas no backend e frontend.

Matriz de Permissões por Role

Recurso Atendente (User) Admin SuperAdmin
Dashboard Leitura Leitura Leitura
Conversas (ver/interagir) Leitura/Escrita Leitura/Escrita Leitura/Escrita
Agentes (visualizar) Leitura CRUD CRUD
Agentes sub-recursos (knowledge, FAQ, etapas, mensagens, IA, follow-up, anexos) Leitura CRUD CRUD
Playground - Acesso Acesso
Instâncias (visualizar) Leitura CRUD CRUD
Conectar instância Sim Sim Sim
Desconectar instância - Sim Sim
Whitelist / Blacklist - CRUD CRUD
Gerenciar usuários - CRUD CRUD
Alterar própria senha Sim Sim Sim
LLM Usage - - Acesso
Tenants - - CRUD
System Settings - - CRUD

Defesa em profundidade: o controle é aplicado em duas camadas: - Backend: endpoints de escrita exigem policy Admin (RequireAuthorization(AuthConstants.Roles.Admin)); endpoints de leitura aceitam qualquer usuário autenticado, com isolamento por tenant via query filters. - Frontend: botões de ação (criar, editar, excluir) são condicionalmente renderizados via AuthService.IsAdminAsync(). Tabs de Whitelist/Blacklist ficam ocultos para Atendente.

Configuração

appsettings.json

{
  "Jwt": {
    "Secret": "chave-secreta-com-pelo-menos-32-caracteres",
    "Issuer": "Ciba",
    "Audience": "Ciba",
    "ExpirationMinutes": 60
  }
}

Uso no Frontend

Login

var response = await ApiClient.LoginAsync(new LoginRequest
{
    Email = email,
    Password = password
});

if (response.IsSuccess)
{
    await LocalStorage.SetItemAsync("token", response.Value.Token);
}

Envio do Token

O AuthorizationMessageHandler adiciona automaticamente o token em todas as requisições:

// Configurado no Program.cs
builder.Services.AddHttpClient("Api", client =>
{
    client.BaseAddress = new Uri(apiUrl);
})
.AddHttpMessageHandler<AuthorizationMessageHandler>();

Verificação de Autenticação

var token = await LocalStorage.GetItemAsync<string>("token");
var isAuthenticated = !string.IsNullOrEmpty(token);

Segurança

  • Senhas armazenadas com BCrypt
  • Tokens expiram em 60 minutos (configurável)
  • Algoritmo de assinatura: HS256
  • Tokens inválidos retornam 401 Unauthorized