Skip to content

ADR-701: API & Authentication

Status: Accepted

Contexto

middag-account precisa de REST API para: portal NextJS (frontend headless), apps mobile futuras, integrações de terceiros, e satélites. API do tema legado (v2/v3) não tem envelope padronizado, payload JWT inconsistente (data.user_id aninhado vs sub top-level), sem rate limiting em auth, sem validação de senha. Desenvolvedores integradores precisam de docs completos, contrato estável e tipos TypeScript.

Decisão

REST API v1

Namespace: middag-account/v1. Endpoints registrados via WordPress REST API com permission_callback em TODA rota. Catálogo completo em REF-701-01.

Envelope de Resposta Padronizado

Todos os endpoints retornam:

json
{
  "success": true,
  "data": { },
  "meta": { "page": 1, "per_page": 20, "total": 100, "pages": 5 },
  "message": null,
  "errors": null
}

Detalhes em REF-701-01.

7 Error Codes

CodeHTTPQuando
VALIDATION_ERROR422Input inválido
AUTHENTICATION_ERROR401Sem token ou token inválido
AUTHORIZATION_ERROR403Sem permissão para recurso
NOT_FOUND404Recurso não existe
CONFLICT409Estado conflitante
RATE_LIMIT429Limite de requisições excedido
INTERNAL_ERROR500Erro interno do servidor

JWT RS256 (Access + Refresh)

  • Access token: TTL 24h, RS256 (private key fora do webroot)
  • Refresh token: TTL 7d
  • Payload: sub, org, roles, scopes no nível superior (não aninhado)
  • Nunca HS256 — RS256 permite validação com public key

Detalhes em REF-701-02.

Headers Multi-Tenant e Dual-Entity

HeaderObrigatórioFunção
AuthorizationSimBearer {jwt_token}
X-Middag-OrganizationSim *ID da organization (isolamento multi-tenant)
X-Middag-CompanyNãomiddag_br / middag_global (roteamento)

* Obrigatório em endpoints que operam sobre dados de organization.

Rate Limiting em /auth

5 tentativas por minuto por IP em endpoints /auth/*. Retorna 429 RATE_LIMIT. Previne brute force em login/registro.

Contrato de Estabilidade

CamadaGarantia
REST API v1Sem breaking changes dentro da v1. Novos endpoints aditivos. Campos nunca removidos. Depreciação com 6 meses de aviso.
WordPress HooksHooks existentes nunca removidos. Novos parâmetros ao final.
Interfaces PHPEstável dentro da MAJOR. Novos métodos requerem bump MAJOR.

Consequências

Positivas:

  • Envelope padronizado elimina inconsistências entre endpoints
  • JWT RS256 com payload top-level alinha com padrões modernos
  • Rate limiting previne brute force (bloqueador #5 resolvido)
  • Contrato de estabilidade dá confiança para desenvolvedores

Negativas:

  • RS256 requer gestão de keypair (private key fora do webroot)
  • Rate limiting por IP pode afetar clientes atrás de NAT
  • Contrato "sem breaking changes" limita refatoração futura

Referências

  • REF-701-01 — API Response Contract
  • REF-701-02 — Authentication Flow
  • ADR-201 — Identity (X-Middag-Organization para multi-tenant)
  • ADR-301 — Commerce (X-Middag-Company para dual-entity)
  • ADR-103 — Plugin Ecosystem (contrato de estabilidade)
  • ADR-103 §Contrato de Estabilidade — API contracts, versioning
  • ../reference/personas.md §6 — Developer persona, API contract