Carbob API - Documentação Completa



Visão Geral



Esta documentação descreve todos os endpoints disponíveis na API Carbob. A API utiliza Laravel Passport para autenticação OAuth2 com suporte a multi-tenancy, incluindo funcionalidades de autenticação, gestão de usuários, password recovery e gestão de recursos.

Base URL


https://api.carbob.pt


Versionamento da API



A API Carbob suporta acesso aos endpoints de duas formas:

Rotas Versionadas


Todas as rotas podem ser acessadas com prefixo de versão explícito (ex: /v1/clients). Estas rotas sempre funcionam e garantem compatibilidade total, mesmo quando a versão padrão mudar no futuro.

Rotas Sem Versão (Versão Padrão)


As rotas também podem ser acessadas sem prefixo de versão (ex: /clients), apontando automaticamente para a versão padrão configurada em config/api.php. Atualmente, a versão padrão é v1.

Exemplos:
  • POST /v1/register ou POST /register - Ambas funcionam

  • GET /v1/clients ou GET /clients - Ambas funcionam


  • Nota: Rotas OAuth (/oauth/*) não têm versão e permanecem como estão.

    Recomendação: Para integrações de longo prazo, use rotas versionadas (/v1/*) para garantir estabilidade. Use rotas sem versão (/*) apenas quando quiser automaticamente usar a versão mais recente configurada.

    Status da API


  • Versão: 1.0.0

  • Última Atualização: Janeiro 2025

  • Funcionalidades: Autenticação, Multi-tenancy, Password Recovery, Gestão de Projetos


  • Índice



  • 1. [Autenticação](#autenticação)

  • 2. [Endpoints de Autenticação](#endpoints-de-autenticação)

  • - [Registro de Usuário](#1-registro-de-novo-usuário-e-tenant)
    - [Obter Token](#2-obter-token-de-acesso)
    - [Solicitar Reset de Senha](#3-solicitar-reset-de-senha)
    - [Resetar Senha](#4-resetar-senha)
  • 3. [Endpoints OAuth2](#5-endpoints-oauth2-do-passport)

  • 4. [Endpoints de Recursos](#endpoints-de-recursos)

  • 5. [Endpoints de Gestão de Usuário](#endpoints-de-gestão-de-usuário)

  • 6. [Endpoints de Teste](#endpoints-de-teste-e-debug)

  • 7. [Códigos de Status](#códigos-de-status-http)

  • 8. [Tratamento de Erros](#tratamento-de-erros)

  • 9. [Fluxo de Autenticação](#fluxo-de-autenticação-completo)

  • 10. [Exemplos de Uso](#exemplos-de-uso-com-curl)

  • 11. [Notas de Segurança](#notas-de-segurança)


  • Autenticação



    A API utiliza Bearer Token authentication com suporte a multi-tenancy através do header X-TENANT-ID.

    Headers Obrigatórios para Rotas Protegidas


  • Authorization: Bearer <access_token>

  • X-TENANT-ID: <tenant_id>

  • Content-Type: application/json (para requisições POST/PUT)


  • Endpoints de Autenticação



    1. Registro de Novo Usuário e Tenant



    Cria um novo tenant e usuário no sistema.

    Endpoint: POST /v1/register ou POST /register

    Nota: Ambas as formas funcionam. A rota sem versão aponta para a versão padrão (v1).

    Headers:
    Content-Type: application/json


    Body:
    {
    "tenant_name": "Nome da Empresa",
    "name": "Nome do Usuário",
    "email": "usuario@exemplo.com",
    "password": "senha123456",
    "password_confirmation": "senha123456"
    }


    Resposta de Sucesso (201):
    {
    "message": "Account created successfully",
    "tenant_id": 1,
    "user_id": 1
    }


    Resposta de Erro (422):
    {
    "message": "The given data was invalid.",
    "errors": {
    "email": ["The email field is required."],
    "password": ["The password must be at least 8 characters."],
    "password_confirmation": ["The password confirmation does not match."]
    }
    }


    Exemplo de Uso:

    Usando rota versionada (recomendado para compatibilidade)


    curl -X POST https://api.carbob.pt/v1/register \
    -H "Content-Type: application/json" \
    -d '{
    "tenant_name": "Empresa ABC",
    "name": "João Silva",
    "email": "joao@empresa.com",
    "password": "minhasenha123",
    "password_confirmation": "minhasenha123"
    }'

    Ou usando rota sem versão (aponta para versão padrão)


    curl -X POST https://api.carbob.pt/register \
    -H "Content-Type: application/json" \
    -d '{
    "tenant_name": "Empresa ABC",
    "name": "João Silva",
    "email": "joao@empresa.com",
    "password": "minhasenha123",
    "password_confirmation": "minhasenha123"
    }'


    2. Obter Token de Acesso



    Gera um token de acesso OAuth2 para autenticação nas rotas protegidas.

    Endpoint: POST /oauth/token

    Headers:
    Content-Type: application/x-www-form-urlencoded
    Accept: application/json


    Body (form-urlencoded):
    grant_type=password
    client_id=seu_client_id
    client_secret=seu_client_secret
    username=usuario@exemplo.com
    password=senha123456
    scope=*


    Resposta de Sucesso (200):
    {
    "token_type": "Bearer",
    "expires_in": 1296000,
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
    "refresh_token": "def50200...",
    "tenant_id": 1
    }


    Resposta de Erro (401):
    {
    "error": "invalid_credentials",
    "error_description": "The user credentials were incorrect."
    }


    Exemplo de Uso:
    curl -X POST https://api.carbob.pt/oauth/token \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -H "Accept: application/json" \
    -d "grant_type=password" \
    -d "client_id=seu_client_id" \
    -d "client_secret=seu_client_secret" \
    -d "username=joao@empresa.com" \
    -d "password=minhasenha123" \
    -d "scope=*"


    Nota: Este endpoint requer um Password Client OAuth2. Para criar um, execute:
    php artisan passport:client --password


    3. Solicitar Reset de Senha



    Envia um link de reset de senha para o email do usuário.

    Endpoint: POST /v1/forgot-password

    Headers:
    Content-Type: application/json


    Body:
    {
    "email": "usuario@exemplo.com"
    }


    Resposta de Sucesso (200):
    {
    "message": "Password reset link sent to your email address.",
    "email": "usuario@exemplo.com"
    }


    Resposta de Erro (422):
    {
    "message": "The given data was invalid.",
    "errors": {
    "email": ["The email field must be a valid email address."]
    }
    }


    Exemplo de Uso:
    curl -X POST https://api.carbob.pt/v1/forgot-password \
    -H "Content-Type: application/json" \
    -d '{
    "email": "joao@empresa.com"
    }'


    4. Resetar Senha



    Define uma nova senha usando o token recebido por email.

    Endpoint: POST /v1/reset-password

    Headers:
    Content-Type: application/json


    Body:
    {
    "email": "usuario@exemplo.com",
    "token": "token_recebido_por_email",
    "password": "nova_senha123456",
    "password_confirmation": "nova_senha123456"
    }


    Resposta de Sucesso (200):
    {
    "message": "Password has been reset successfully.",
    "status": "success"
    }


    Resposta de Erro (422):
    {
    "message": "Unable to reset password.",
    "errors": {
    "token": ["The password reset token is invalid or has expired."]
    }
    }


    Exemplo de Uso:
    curl -X POST https://api.carbob.pt/v1/reset-password \
    -H "Content-Type: application/json" \
    -d '{
    "email": "joao@empresa.com",
    "token": "abc123def456",
    "password": "minhanovasenha123",
    "password_confirmation": "minhanovasenha123"
    }'


    5. Endpoints OAuth2 do Passport



    A API também suporta os endpoints padrão do Laravel Passport:

    5.1. Obter Token OAuth2


    Endpoint: POST /oauth/token

    5.2. Renovar Token


    Endpoint: POST /oauth/token/refresh

    5.3. Autorização OAuth2


    Endpoint: GET /oauth/authorize
    Endpoint: POST /oauth/authorize
    Endpoint: DELETE /oauth/authorize

    Endpoints de Recursos



    Endpoints de Gestão de Usuário



    1. Obter Informações do Usuário



    Retorna as informações do usuário autenticado.

    Endpoint: GET /v1/user

    Headers:
    Authorization: Bearer <access_token>
    X-TENANT-ID: <tenant_id>


    Resposta de Sucesso (200):
    {
    "id": 1,
    "name": "João Silva",
    "email": "joao@empresa.com",
    "tenant_id": 1,
    "created_at": "2024-01-15T10:30:00.000000Z",
    "updated_at": "2024-01-15T10:30:00.000000Z"
    }


    Exemplo de Uso:
    curl https://api.carbob.pt/v1/user \
    -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..." \
    -H "X-TENANT-ID: 1"


    2. Atualizar Informações do Usuário



    Atualiza nome e/ou email do usuário autenticado.

    Endpoint: PUT /v1/user

    Headers:
    Authorization: Bearer <access_token>
    X-TENANT-ID: <tenant_id>
    Content-Type: application/json


    Body:
    {
    "name": "João Silva Santos",
    "email": "joao.santos@empresa.com"
    }


    Resposta de Sucesso (200):
    {
    "message": "User information updated successfully.",
    "user": {
    "id": 1,
    "name": "João Silva Santos",
    "email": "joao.santos@empresa.com",
    "tenant_id": 1,
    "updated_at": "2024-01-15T11:00:00.000000Z"
    }
    }


    Resposta de Erro (422):
    {
    "message": "The given data was invalid.",
    "errors": {
    "email": ["The email has already been taken."]
    }
    }


    Exemplo de Uso:
    curl -X PUT https://api.carbob.pt/v1/user \
    -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..." \
    -H "X-TENANT-ID: 1" \
    -H "Content-Type: application/json" \
    -d '{
    "name": "João Silva Santos",
    "email": "joao.santos@empresa.com"
    }'


    3. Alterar Senha



    Altera a senha do usuário autenticado.

    Endpoint: POST /v1/user/change-password

    Headers:
    Authorization: Bearer <access_token>
    X-TENANT-ID: <tenant_id>
    Content-Type: application/json


    Body:
    {
    "current_password": "senha_atual123",
    "password": "nova_senha123456",
    "password_confirmation": "nova_senha123456"
    }


    Resposta de Sucesso (200):
    {
    "message": "Password changed successfully. Please log in again.",
    "status": "success"
    }


    Resposta de Erro (422):
    {
    "message": "The given data was invalid.",
    "errors": {
    "current_password": ["The current password is incorrect."]
    }
    }


    Exemplo de Uso:
    curl -X POST https://api.carbob.pt/v1/user/change-password \
    -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..." \
    -H "X-TENANT-ID: 1" \
    -H "Content-Type: application/json" \
    -d '{
    "current_password": "senha_atual123",
    "password": "nova_senha123456",
    "password_confirmation": "nova_senha123456"
    }'


    Nota Importante: Após alterar a senha, todos os tokens existentes são revogados por segurança. O usuário precisará fazer login novamente.

    Endpoints de Teste e Debug



    1. Health Check



    Verifica o status da API.

    Endpoint: GET /v1/health

    Resposta:
    {
    "status": "ok",
    "time": "2024-01-15T10:30:00.000000Z"
    }


    2. Ping



    Endpoint simples para verificar conectividade.

    Endpoint: GET /v1/ping

    Resposta:
    {
    "message": "pong",
    "timestamp": "2024-01-15T10:30:00.000000Z"
    }


    3. Teste de Autenticação



    Testa se a autenticação está funcionando corretamente.

    Endpoint: GET /v1/test-auth

    Headers:
    Authorization: Bearer <access_token>


    Resposta:
    {
    "message": "Auth working",
    "user": "usuario@exemplo.com"
    }


    4. Debug de Token



    Endpoint para debug de informações do token.

    Endpoint: GET /v1/debug-token

    Resposta:
    {
    "has_auth_header": true,
    "auth_header": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
    "bearer_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",
    "user": "usuario@exemplo.com",
    "guard": "api"
    }


    Códigos de Status HTTP



    | Código | Descrição |
    |--------|-----------|
    | 200 | Sucesso |
    | 201 | Criado com sucesso |
    | 401 | Não autorizado |
    | 403 | Acesso negado |
    | 422 | Dados inválidos |
    | 500 | Erro interno do servidor |

    Tratamento de Erros



    Erro de Credenciais Inválidas (401)


    {
    "error": "invalid_credentials",
    "message": "The user credentials were incorrect."
    }


    Erro de Header Tenant Ausente (403)


    {
    "error": "Missing X-TENANT-ID header"
    }


    Erro de Tenant Incorreto (403)


    {
    "error": "User does not belong to this tenant"
    }


    Erro de Validação (422)


    {
    "message": "The given data was invalid.",
    "errors": {
    "field_name": ["Error message"]
    }
    }


    Fluxo de Autenticação Completo



    1. Registro


  • 1. Fazer POST para /v1/register com dados do tenant e usuário

  • 2. Receber tenant_id e user_id na resposta

  • 3. Guardar o tenant_id para uso posterior


  • 2. Autenticação


  • 1. Fazer POST para /oauth/token com grant_type, client_id, client_secret, username e senha

  • 2. Receber access_token, refresh_token e tenant_id na resposta

  • 3. Guardar o access_token e tenant_id para uso posterior


  • 3. Acesso a Recursos Protegidos


  • 1. Incluir header Authorization: Bearer <access_token>

  • 2. Incluir header X-TENANT-ID: <tenant_id>

  • 3. Fazer requisições para endpoints protegidos


  • 4. Recuperação de Senha


  • 1. Fazer POST para /v1/forgot-password com email

  • 2. Receber confirmação de envio do email

  • 3. Verificar email e clicar no link de reset

  • 4. Fazer POST para /v1/reset-password com token e nova senha

  • 5. Fazer login com nova senha via /oauth/token


  • Exemplos de Uso com cURL



    Registro Completo


    1. Registrar novo usuário e tenant


    curl -X POST https://api.carbob.pt/v1/register \
    -H "Content-Type: application/json" \
    -d '{
    "tenant_name": "Minha Empresa",
    "name": "João Silva",
    "email": "joao@minhaempresa.com",
    "password": "senha123456",
    "password_confirmation": "senha123456"
    }'

    Resposta esperada:


    {


    "message": "Account created successfully",


    "tenant_id": 1,


    "user_id": 1


    }



    Autenticação


    2. Obter token de acesso


    curl -X POST https://api.carbob.pt/oauth/token \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -H "Accept: application/json" \
    -d "grant_type=password" \
    -d "client_id=seu_client_id" \
    -d "client_secret=seu_client_secret" \
    -d "username=joao@minhaempresa.com" \
    -d "password=senha123456" \
    -d "scope=*"

    Resposta esperada:


    {


    "token_type": "Bearer",


    "expires_in": 1296000,


    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9...",


    "refresh_token": "def50200...",


    "tenant_id": 1


    }



    Acesso a Recursos Protegidos


    3. Acessar recursos protegidos


    curl https://api.carbob.pt/v1/clients \
    -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9..." \
    -H "X-TENANT-ID: 1"


    Password Recovery


    4. Solicitar reset de senha


    curl -X POST https://api.carbob.pt/v1/forgot-password \
    -H "Content-Type: application/json" \
    -d '{
    "email": "joao@minhaempresa.com"
    }'

    Resposta esperada:


    {


    "message": "Password reset link sent to your email address.",


    "email": "joao@minhaempresa.com"


    }



    5. Resetar senha (usar token do email)


    curl -X POST https://api.carbob.pt/v1/reset-password \
    -H "Content-Type: application/json" \
    -d '{
    "email": "joao@minhaempresa.com",
    "token": "abc123def456",
    "password": "novasenha123456",
    "password_confirmation": "novasenha123456"
    }'

    Resposta esperada:


    {


    "message": "Password has been reset successfully.",


    "status": "success"


    }



    Refresh Token


    6. Renovar token (se necessário)


    curl -X POST https://api.carbob.pt/oauth/token/refresh \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -d "grant_type=refresh_token" \
    -d "refresh_token=def50200..." \
    -d "client_id=1" \
    -d "client_secret=secret"


    Notas de Segurança



  • 1. Tokens de Acesso: Expirem em 1 ano (31536000 segundos)

  • 2. Refresh Tokens: Expirem em 30 dias, renovação automática recomendada

  • 3. Multi-tenancy: Todos os dados são automaticamente filtrados por tenant_id

  • 4. Header Obrigatório: O header X-TENANT-ID é obrigatório para todas as rotas protegidas

  • 5. Validação de Tenant: Usuários só podem acessar recursos do seu próprio tenant

  • 6. Password Recovery:

  • - Tokens de reset expiram em 60 minutos
    - Throttle de 60 segundos entre tentativas
    - Todos os tokens são revogados após reset
  • 7. Rate Limiting: Considere implementar rate limiting nos endpoints de autenticação

  • 8. HTTPS: Sempre use HTTPS em produção

  • 9. Validação de Email: Emails são validados antes do envio de reset


  • Configuração de Email



    Para que o password recovery funcione, configure o envio de emails no .env:

    Email Configuration


    MAIL_MAILER=smtp
    MAIL_HOST=smtp.gmail.com
    MAIL_PORT=587
    MAIL_USERNAME=your-email@gmail.com
    MAIL_PASSWORD=your-app-password
    MAIL_ENCRYPTION=tls
    MAIL_FROM_ADDRESS=noreply@carbob.pt
    MAIL_FROM_NAME="Carbob API"


    Configuração do Frontend URL



    Para links de reset de senha funcionarem corretamente:

    Frontend URL para links de reset


    CARBOB_FRONTEND_URL=https://manager.carbob.pt


    Suporte



    Para dúvidas ou problemas com a autenticação, consulte:
  • Documentação do Laravel Passport: https://laravel.com/docs/passport

  • Testes automatizados: tests/Feature/AuthFlowTest.php

  • Testes de Password Recovery: tests/Feature/PasswordRecoveryTest.php

  • Logs da aplicação: storage/logs/laravel.log

  • Coleção Postman: docs/carbob-auth-postman.json


  • Changelog



    v1.0.0 (Janeiro 2025)


  • ✅ Implementação inicial da API

  • ✅ Autenticação OAuth2 com Passport

  • ✅ Multi-tenancy com headers

  • ✅ Gestão de projetos

  • ✅ Password recovery completo

  • ✅ Refresh token automático

  • ✅ Documentação completa

  • ✅ Testes automatizados

  • ✅ Coleção Postman