Exemplos de Request/Response - ecosif-auth

Atualizado: login Azure/Google via POST /api/auth/external-login. signin-azure removido.

Este documento contém exemplos práticos de requisições e respostas para todos os endpoints da API.

Autenticação Local

Request

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

Response (Sucesso)

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

Response (Credenciais Inválidas)

{
  "success": false,
  "message": "Usuário ou senha incorretos"
}

Response (Usuário Inativo)

{
  "success": false,
  "message": "Usuário inativo"
}

Login externo (external-login)

Ver seção em autenticacao.md.


Login externo (external-login)

Request

curl -X POST http://localhost:8080/api/auth/external-login \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "AZURE",
    "token": "<id_token do Entra ID>",
    "tokenType": "ID_TOKEN"
  }'

Response (Sucesso — auto-provision)

{
  "accessToken": "eyJhbGciOiJIUzI1NiJ9...",
  "user": {
    "id": "3",
    "displayName": "Maria Santos",
    "email": "maria.santos@empresa.com",
    "roles": ["STAFF"],
    "tenant": "TEMP_TENANT"
  },
  "tenantName": "TEMP_TENANT"
}

Response (Erro — token inválido)

{
  "success": false,
  "message": "Token Microsoft inválido"
}

Response (Erro — usuário não cadastrado)

{
  "success": false,
  "message": "Usuário não encontrado no eCosif"
}

Obter Logs Docker

Request

TOKEN="eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTY0MDAwMDAwMCwiZXhwIjoxNjQwMDE4MDAwfQ.xyz"

curl -X GET "http://localhost:8080/api/admin/docker-logs?service=ecosif-auth&lines=50" \
  -H "Authorization: Bearer $TOKEN"

Response (Sucesso)

{
  "service": "ecosif-auth",
  "containerName": "ecosif-auth",
  "lines": 50,
  "logs": "2024-01-01 10:00:00.000  INFO  [main] io.ecosif.auth.Application : Starting Application\n2024-01-01 10:00:01.000  INFO  [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http)\n2024-01-01 10:00:02.000  INFO  [main] io.ecosif.auth.Application : Started Application in 2.5 seconds\n"
}

Response (Serviço Não Encontrado)

{
  "error": "Serviço não encontrado: servico-inexistente",
  "availableServices": [
    "ecosif-auth",
    "ecosif-masterdata",
    "ecosif-moviments",
    "ecosif-querys",
    "ecosif-reports",
    "ecosif-compliance",
    "ecosif-angular",
    "nginx",
    "postgres"
  ]
}

Response (Token Inválido)

HTTP/1.1 401 Unauthorized

Listar Serviços para Logs

Request

TOKEN="eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTY0MDAwMDAwMCwiZXhwIjoxNjQwMDE4MDAwfQ.xyz"

curl -X GET "http://localhost:8080/api/admin/docker-logs/services" \
  -H "Authorization: Bearer $TOKEN"

Response (Sucesso)

{
  "services": [
    "ecosif-auth",
    "ecosif-masterdata",
    "ecosif-moviments",
    "ecosif-querys",
    "ecosif-reports",
    "ecosif-compliance",
    "ecosif-angular",
    "nginx",
    "postgres"
  ],
  "serviceToContainer": {
    "ecosif-auth": "ecosif-auth",
    "ecosif-masterdata": "ecosif-masterdata",
    "ecosif-moviments": "ecosif-moviments",
    "ecosif-querys": "ecosif-querys",
    "ecosif-reports": "ecosif-reports",
    "ecosif-compliance": "ecosif-compliance",
    "ecosif-angular": "ecosif-angular",
    "nginx": "ecosif-nginx",
    "postgres": "ecosif-postgres"
  }
}

Health Check

Request

curl http://localhost:8080/actuator/health

Response (Sucesso)

{
  "status": "UP",
  "components": {
    "db": {
      "status": "UP",
      "details": {
        "database": "PostgreSQL",
        "validationQuery": "isValid()"
      }
    }
  }
}

Response (Serviço Indisponível)

{
  "status": "DOWN",
  "components": {
    "db": {
      "status": "DOWN"
    }
  }
}

Exemplos em JavaScript

Autenticação e Uso do Token

// 1. Fazer login
async function fazerLogin(username, password) {
  const response = await fetch('http://localhost:8080/api/auth/signin', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      username: username,
      password: password,
      azure: false
    })
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(error.message);
  }

  const data = await response.json();
  return data.accessToken;
}

// 2. Usar token em requisições
async function obterLogs(service, token) {
  const response = await fetch(
    `http://localhost:8080/api/admin/docker-logs?service=${service}&lines=100`,
    {
      headers: {
        'Authorization': `Bearer ${token}`
      }
    }
  );

  if (!response.ok) {
    if (response.status === 401) {
      throw new Error('Token expirado ou inválido');
    }
    const error = await response.json();
    throw new Error(error.message || 'Erro na requisição');
  }

  return await response.json();
}

// 3. Uso completo
(async () => {
  try {
    const token = await fazerLogin('admin', 'admin123');
    console.log('Token obtido:', token);

    const logs = await obterLogs('ecosif-auth', token);
    console.log('Logs:', logs);
  } catch (error) {
    console.error('Erro:', error.message);
  }
})();

Exemplos em Python

import requests

# 1. Fazer login
def fazer_login(username, password):
    url = 'http://localhost:8080/api/auth/signin'
    data = {
        'username': username,
        'password': password,
        'azure': False
    }

    response = requests.post(url, json=data)
    response.raise_for_status()

    return response.json()['accessToken']

# 2. Obter logs
def obter_logs(service, token, lines=100):
    url = f'http://localhost:8080/api/admin/docker-logs'
    params = {
        'service': service,
        'lines': lines
    }
    headers = {
        'Authorization': f'Bearer {token}'
    }

    response = requests.get(url, params=params, headers=headers)
    response.raise_for_status()

    return response.json()

# 3. Uso completo
if __name__ == '__main__':
    try:
        token = fazer_login('admin', 'admin123')
        print(f'Token obtido: {token[:50]}...')

        logs = obter_logs('ecosif-auth', token)
        print(f'Logs obtidos: {len(logs["logs"])} caracteres')
    except requests.exceptions.HTTPError as e:
        print(f'Erro HTTP: {e}')
    except Exception as e:
        print(f'Erro: {e}')

Exemplos em Java

import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import com.fasterxml.jackson.databind.ObjectMapper;

public class EcosifAuthClient {
    private final HttpClient client = HttpClient.newHttpClient();
    private final ObjectMapper mapper = new ObjectMapper();
    private final String baseUrl = "http://localhost:8080";

    public String fazerLogin(String username, String password) throws Exception {
        String json = String.format(
            "{\"username\":\"%s\",\"password\":\"%s\",\"azure\":false}",
            username, password
        );

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(baseUrl + "/api/auth/signin"))
            .header("Content-Type", "application/json")
            .POST(HttpRequest.BodyPublishers.ofString(json))
            .build();

        HttpResponse<String> response = client.send(request, 
            HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
            throw new RuntimeException("Erro no login: " + response.body());
        }

        Map<String, Object> data = mapper.readValue(response.body(), Map.class);
        return (String) data.get("accessToken");
    }

    public String obterLogs(String service, String token) throws Exception {
        String url = baseUrl + "/api/admin/docker-logs?service=" + service + "&lines=100";

        HttpRequest request = HttpRequest.newBuilder()
            .uri(URI.create(url))
            .header("Authorization", "Bearer " + token)
            .GET()
            .build();

        HttpResponse<String> response = client.send(request, 
            HttpResponse.BodyHandlers.ofString());

        if (response.statusCode() != 200) {
            throw new RuntimeException("Erro ao obter logs: " + response.body());
        }

        return response.body();
    }
}

Próximos Passos