Skip to content

Autenticacao

A API externa da Owem Pay utiliza um modelo de seguranca em tres camadas: API Key + Secret, assinatura HMAC-SHA512 por requisicao e whitelist de IP obrigatoria.

Visao Geral das Camadas

Requisicao HTTP

  ├─ 1. IP Whitelist ─── IP nao autorizado? → 403 Forbidden

  ├─ 2. API Key + Secret ─── Credenciais invalidas? → 401 Unauthorized

  └─ 3. HMAC-SHA512 ─── Assinatura invalida? → 401 Unauthorized

       └─ Requisicao aceita → Logica de negocio

Camada 1 -- API Key + Secret

Todas as requisicoes devem incluir o header Authorization:

Authorization: ApiKey {client_id}:{client_secret}
ComponenteDescricaoPrefixo
client_idIdentificador publico da API Keycli_
client_secretChave secreta (armazenamos apenas o hash)sk_

O secret nunca e armazenado em texto puro. Quando uma requisicao chega, o secret enviado e comparado com o hash armazenado. Se nao corresponder, a requisicao e rejeitada antes de chegar a logica de negocio.

Formato alternativo -- Basic Auth com base64:

Authorization: Basic {base64(client_id:client_secret)}

Camada 2 -- HMAC-SHA512

Requisicoes transacionais (POST, PUT, PATCH) exigem assinatura HMAC-SHA512 do body no header hmac. A validacao usa comparacao em tempo constante (constant-time comparison) para impedir ataques de timing.

Veja HMAC-SHA512 para exemplos de implementacao em 6 linguagens.

Camada 3 -- IP Whitelist

Toda API Key deve ter pelo menos um IP na whitelist. Requisicoes de IPs nao autorizados sao rejeitadas com 403 Forbidden, mesmo com credenciais validas. Configure a whitelist no Merchant Portal ao criar ou editar a API Key.

Suporta IPs individuais e notacao CIDR (ex: 172.20.16.0/20).

Headers Obrigatorios

HeaderValorObrigatorio
AuthorizationApiKey {client_id}:{client_secret}Sim -- todas as requisicoes
Content-Typeapplication/jsonSim -- requisicoes com body
hmacAssinatura HMAC-SHA512 em hexadecimalSim -- apenas POST/PUT/PATCH
Idempotency-KeyChave unica para deduplicacao (max 256 chars)Opcional -- apenas POST

Exemplo Completo

bash
CLIENT_ID="cli_a1b2c3d4e5f6"
CLIENT_SECRET="sk_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef01"

# Consulta de saldo (GET -- sem HMAC)
curl -X GET https://api.owem.com.br/api/external/balance \
  -H "Authorization: ApiKey $CLIENT_ID:$CLIENT_SECRET"

# PIX Cash-Out (POST -- com HMAC + Idempotency-Key)
BODY='{"amount":3000,"pix_key":"12345678901","pix_key_type":"cpf","description":"Pagamento"}'
HMAC=$(echo -n "$BODY" | openssl dgst -sha512 -hmac "$CLIENT_SECRET" | awk '{print $2}')

curl -X POST https://api.owem.com.br/api/external/pix/cash-out \
  -H "Authorization: ApiKey $CLIENT_ID:$CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -H "hmac: $HMAC" \
  -H "Idempotency-Key: cashout-order-9876" \
  -d "$BODY"

Protecoes Adicionais

ProtecaoDescricao
Rate Limiting60.000 req/min por IP (autenticado). 5 req/min (sem autenticacao)
Cloud Armor (WAF)Firewall de aplicacao protegendo o cluster
HTTPS + TLS 1.2+Criptografia obrigatoria em todas as conexoes
HSTSNavegadores forcados a usar HTTPS

Por que HMAC-SHA512 e nao mTLS?

O mTLS (mutual TLS) autentica a conexao, nao o conteudo. Se a conexao esta autenticada, todas as requisicoes passam sem validacao individual.

O HMAC valida cada requisicao separadamente. Mesmo dentro de uma conexao valida, qualquer alteracao no payload faz a requisicao ser rejeitada.

AspectomTLSHMAC-SHA512
ValidaCanal TLSPayload da requisicao
GestaoCertificados X.509 (emissao, rotacao, revogacao, CRL/OCSP)Gera par, atualiza, invalida
Risco operacionalCertificados expirados -- causa frequente de incidentesChave e string simples
Integridade do conteudoNaoSim

O TLS ja garante criptografia do transporte. O HMAC adiciona integridade e autenticidade do payload -- algo que o mTLS por si so nao cobre.

Respostas de Erro

401 -- Credenciais Ausentes

json
{
  "error": {
    "status": 401,
    "message": "Missing API key credentials. Use Authorization: ApiKey <client_id>:<client_secret>"
  }
}

403 -- IP nao Autorizado

json
{
  "error": {
    "status": 403,
    "message": "Request IP not in API key whitelist"
  }
}

429 -- Rate Limit Excedido

json
{
  "error": {
    "status": 429,
    "message": "Too Many Requests"
  }
}

Seguranca

  • Nunca exponha o client_secret em codigo frontend ou repositorios publicos
  • Utilize variaveis de ambiente no seu servidor
  • A API Key e permanente -- nao expira, mas pode ser revogada no Merchant Portal
  • Configure IPs permitidos na whitelist

Owem Pay Instituição de Pagamento — ISPB 37839059