Pular para o conteúdo principal

Autenticação

A Catalisa Platform utiliza OAuth 2.0 para autenticação. Todas as requisições aos Building Blocks (exceto endpoints públicos) requerem um token de acesso válido.

Métodos de Autenticação

1. Client Credentials (M2M)

Use este método para integração servidor-a-servidor (machine-to-machine). Ideal para backends e automações.

curl -X POST 'https://api.catalisa.io/iam/oauth/token' \
-H 'Content-Type: application/json' \
-d '{
"grant_type": "client_credentials",
"client_id": "sua-organização-id",
"client_secret": "seu-client-secret"
}'

Resposta

{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600
}

2. Refresh Token

Use este método para renovar tokens expirados sem precisar das credenciais originais.

curl -X POST 'https://api.catalisa.io/iam/oauth/token' \
-H 'Content-Type: application/json' \
-d '{
"grant_type": "refresh_token",
"refresh_token": "seu-refresh-token"
}'

3. Login de Usuário

Use este método para autenticar usuários finais em aplicações frontend.

curl -X POST 'https://api.catalisa.io/iam/api/v1/users/login' \
-H 'Content-Type: application/json' \
-d '{
"email": "usuário@exemplo.com",
"password": "senha123"
}'

Usando o Token

Inclua o token em todas as requisições usando o header Authorization:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Tokens e Expiração

TipoDuraçãoUso
Access Token1 horaRequisições de API
Refresh Token7 diasRenovar access token
Atenção
  • Tokens de acesso expiram após 1 hora
  • Sempre implemente lógica de renovação automática
  • Nunca exponha o client_secret no frontend

Permissões

O sistema utiliza RBAC (Role-Based Access Control). Cada token carrega as permissões do usuário/organização.

Roles Disponíveis

RoleDescrição
ADMINAcesso total ao sistema
IAM_MANAGERGerencia usuários e organizações
CUSTOMER_MANAGERGerencia clientes
PRODUCT_MANAGERGerencia produtos
DECISION_MANAGERGerencia regras de decisão
PRICING_MANAGERGerencia pricing e risk bands
FILE_MANAGERGerencia arquivos
VIEWERSomente leitura

Permissões Principais

PermissãoDescrição
IAM_USERS_CREATECriar usuários
IAM_USERS_READListar/visualizar usuários
IAM_USERS_UPDATEAtualizar usuários
IAM_USERS_DELETEExcluir usuários
IAM_ORGANIZATIONS_*Operações em organizações
CUSTOMERS_PEOPLE_*Operações em pessoas
PRODUCTS_*Operações em produtos
DECISION_*Operações no motor de decisão
PRICING_*Operações no pricing engine
FILES_*Operações em arquivos
CALCULATIONS_EXECUTEExecutar calculadoras
informação

Para a lista completa de permissões, consulte a documentação de Roles.

Módulos Globais vs Tenant-Scoped

Módulo Global (IAM)

O módulo IAM não requer escopo de organização. Endpoints como /oauth/token e /users/login são públicos.

Módulos Tenant-Scoped

Os demais módulos requerem um token com organizationId. Ao usar Client Credentials, o organizationId é automaticamente incluído no token.

Customers, File Storage, Products, Decision Engine,
Calculations Engine, Pricing Engine

Exemplo Completo

class CatalisaClient {
constructor(clientId, clientSecret) {
this.clientId = clientId;
this.clientSecret = clientSecret;
this.accessToken = null;
this.tokenExpiry = null;
}

async getToken() {
// Verifica se o token ainda é válido
if (this.accessToken && this.tokenExpiry > Date.now()) {
return this.accessToken;
}

// Obtem novo token
const response = await fetch('https://api.catalisa.io/iam/oauth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
grant_type: 'client_credentials',
client_id: this.clientId,
client_secret: this.clientSecret,
}),
});

const data = await response.json();
this.accessToken = data.access_token;
this.tokenExpiry = Date.now() + (data.expires_in * 1000) - 60000; // 1 min buffer

return this.accessToken;
}

async request(method, path, body = null) {
const token = await this.getToken();

const options = {
method,
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
};

if (body) {
options.body = JSON.stringify(body);
}

const response = await fetch(`https://api.catalisa.io${path}`, options);
return response.json();
}
}

// Uso
const client = new CatalisaClient('org-id', 'secret');
const products = await client.request('GET', '/products/api/v1/products');