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:
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 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