Autenticação - Guia para Integradores

Este guia explica como autenticar e usar a API do ecosif-masterdata.

Visão Geral

O ecosif-masterdata não possui endpoints de autenticação próprios. Ele valida tokens JWT emitidos pelo serviço ecosif-auth (porta 8080).

Fluxo de Autenticação

1. Cliente → ecosif-auth (porta 8080)
   POST /api/auth/signin

2. ecosif-auth → Cliente
   { accessToken: "eyJhbGciOiJIUzI1NiJ9..." }

3. Cliente → ecosif-masterdata (porta 8081)
   GET /companies
   Authorization: Bearer <token>

4. ecosif-masterdata → Cliente
   [valida token e retorna dados]

Passo 1: Obter Token JWT

Endpoint de Login

Faça login no ecosif-auth (porta 8080):

curl -X POST http://localhost:8080/api/auth/signin \
  -H "Content-Type: application/json" \
  -d '{
    "username": "admin",
    "password": "senha",
    "azure": false
  }'

Response

{
  "accessToken": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTY0MDAwMDAwMCwiZXhwIjoxNjQwMDE4MDAwfQ.xyz",
  "user": {
    "id": "1",
    "displayName": "Administrator",
    "email": "admin",
    "roles": ["ADMIN"],
    "tenant": "TEMP_TENANT"
  },
  "tenantName": "TEMP_TENANT"
}

Passo 2: Usar Token nas Requisições

Header Authorization

Inclua o token no header Authorization:

Authorization: Bearer <seu-token-jwt>

Exemplo com cURL

TOKEN="eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTY0MDAwMDAwMCwiZXhwIjoxNjQwMDE4MDAwfQ.xyz"

curl -X GET http://localhost:8081/companies \
  -H "Authorization: Bearer $TOKEN"

Exemplo com JavaScript

const token = localStorage.getItem('token');

const response = await fetch('http://localhost:8081/companies', {
  headers: {
    'Authorization': `Bearer ${token}`
  }
});

const companies = await response.json();

Exemplo com Python

import requests

token = "seu-token-jwt-aqui"

headers = {
    'Authorization': f'Bearer {token}'
}

response = requests.get('http://localhost:8081/companies', headers=headers)
companies = response.json()

Renovação de Token

Tokens JWT expiram após 30 minutos (padrão). Quando expirar:

  1. Cliente recebe 401 Unauthorized em requisições
  2. Cliente deve fazer login novamente no ecosif-auth
  3. Cliente usa novo token em requisições subsequentes

Tratamento de Token Expirado

async function fazerRequisicao(url) {
  let token = localStorage.getItem('token');

  let response = await fetch(url, {
    headers: {
      'Authorization': `Bearer ${token}`
    }
  });

  // Se token expirou, fazer login novamente
  if (response.status === 401) {
    // Fazer login novamente no ecosif-auth
    const loginResponse = await fetch('http://localhost:8080/api/auth/signin', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        username: 'admin',
        password: 'senha',
        azure: false
      })
    });

    const loginData = await loginResponse.json();
    token = loginData.accessToken;
    localStorage.setItem('token', token);

    // Tentar requisição novamente
    response = await fetch(url, {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    });
  }

  return response.json();
}

Endpoints que Não Requerem Autenticação

Os seguintes endpoints são públicos:

Todos os outros endpoints requerem autenticação JWT válida.

Validação do Token

O ecosif-masterdata valida o token JWT:

  1. Verifica a assinatura (usando a mesma chave secreta do ecosif-auth)
  2. Verifica se o token não expirou
  3. Extrai informações do usuário do token

Se o token for inválido ou expirado, retorna 401 Unauthorized.

Boas Práticas

  1. Armazene o token com segurança: Use localStorage, sessionStorage ou gerenciador de estado
  2. Não exponha o token: Não inclua em URLs ou logs
  3. Trate expiração: Implemente renovação automática quando possível
  4. Use HTTPS: Sempre use HTTPS em produção
  5. Valide respostas: Sempre verifique códigos de status HTTP

Próximos Passos