Saltar para o conteúdo principal

Autenticação e chaves de API

Implementação L1 em functions/src/api/. Cada pedido HTTP usa Authorization: Bearer <chave-ou-access-token>; não aceita ID tokens Firebase como credenciais da API/MCP. A Etapa 1 acrescenta access tokens OAuth opacos aed_atk_…, com consentimento Firebase separado; ver MCP/OAuth. O segredo é devolvido uma vez pela callable de criação/rotação e nunca deve aparecer em logs ou ficheiros versionados.

Formato: aed_live_<16 caracteres hex>_<43 caracteres base64url>; aed_test_… só funciona com o emulador Firestore configurado. Não há prefixo de exemplo utilizável nesta documentação.

Apenas SHA-256 do valor completo e prefixo ficam em organizations/{orgId}/apiKeys/{id}. apiKeyLookup/{prefix} resolve a organização/ID; não contém a chave. Não existe API_KEY_PEPPER. Comparação em tempo constante. Todas estas coleções são exclusivamente servidor; metadados seguros são devolvidos por callable.

Âmbitos explícitos: read permite GET; write permite POST. Uma chave só com write não pode ler. A organização vem da chave; um ID de outra organização não revela existência. Cada pedido revalida que o criador continua owner/admin e atualiza último uso, no máximo uma vez por minuto. Revogação e rotação têm efeito imediato; rotação revoga a anterior na mesma transação.

Gestão na app​

Callables Firebase autenticadas, owner/admin, em europe-west1:

NomeEntradaSaída
listApiKeys{}{keys:[metadata]} (100 mais recentes)
createApiKey{name,scopes:["read","write"],environment:"live"}{key:metadata,secret}
rotateApiKey{id}{key:metadata,secret}
revokeApiKey{id}{id}

metadata: id, name, prefix, scopes, environment, createdAt, lastUsedAt, revokedAt. Não inclui hash. As mutações verificam o papel novamente dentro da transação. UI em Definições → API (settings/api); o gating de plano só se aplica com VITE_BILLING_ENABLED.

IAM HTTP fica com Walter/orquestrador. O código onRequest não declara invoker:'public'; a API exige a chave mesmo atrás do proxy autenticado. Nenhum deploy foi executado neste lote.