
FAPI 1.0 no Brasil: A blindagem obrigatória que o OAuth simples não oferece
Entenda por que implementar apenas o fluxo padrão OAuth 2.0 é insuficiente para o Banco Central e como o perfil FAPI 1.0 protege o token de acesso contra replay e vazamento.
Fintomico
A aprovação nos testes de conformidade de segurança do Open Banking exige eliminar atalhos de interface que expõem o token de acesso, forçando um redesign doloroso.


Em 2026, a maturidade do ecossistema de Open Banking no Brasil não deixa margem para amadorismo. Se por um lado o consumidor exige fluidez, como a experiente nos grandes bancos digitais, por outro, o regulador e os laboratórios de validação — que executam os testes de segurança exigidos pelo Banco Central — mantêm o cerco fechado. Para Product Managers (PMs) e Designers de UX, a fase de homologação é frequentemente onde o sonho de uma interface perfeita morre. O conflito é brutal: cada facilidade visual introduzida para reduzir cliques pode, do ponto de vista da segurança cibernética financeira, abrir uma brecha crítica para interceptação de dados.
Ao longo das auditorias que acompanhei neste ano, vi equipes de desenvolvimento frustradas ao terem que rasgar protótipos funcionalmente bonitos, mas tecnicamente inseguros. O problema central raramente é a criptografia em si, mas como a interface humana manipula os tokens de acesso e os identificadores de consentimento. Abaixo, listo quatro facilidades de interface que são sistematicamente sacrificadas no altar do Security Test para garantir a conformidade com o padrão FAPI (Financial-grade API).
Há um cenário clássico de UX: o usuário inicia o compartilhamento de dados no aplicativo de uma fintech, mas o Deep Link que deveria abrir o aplicativo do banco falha — seja por um bug do Android, seja porque o usuário desabilitou a abertura automática. A solução de design mais imediata? Exibir uma tela de fallback com um código curto (o consent_id) e a instrução: "Copie este código e cole no aplicativo do seu banco".
Do ponto de vista de usabilidade, isso salva a conversão. Para o auditor de segurança, é um desastre de privacidade. O uso da área de transferência (clipboard) para transportar identificadores sensíveis é vetado na maioria das políticas de segurança rígidas de 2026. O motivo é a facilidade com que malwares de leitura de clipboard — comuns em dispositivos Android rooted ou com permissões mal geridas — podem capturar esse dado em segundo plano antes mesmo de o usuário colar o código. Se um agente malicioso captura o consent_id válido, ele pode tentar forçar uma aprovação em uma sessão paralela ou realizar engenharia social. O teste de segurança falha imediatamente ao detectar que o fluxo permite a exposição desse identificador em um formato de texto puro copiável, obrigando a equipe a remover o atalho e forçar o usuário a reiniciar o processo ou utilizar outra via de autenticação mais segura, como QR Code dinâmico com validação criptográfica.

Outra armadilha comum que elimina interfaces de fácil implementação é a forma como o authorization_code é recebido após o redirecionamento. Desenvolvedores acostumados com fluxos web tradicionais tendem a configurar a Redirect URI para receber o token via Query String (o que vem depois do ? na URL). Por que fazem isso? Porque é trivial ler o parâmetro no backend ou até mesmo no frontend para exibir um "Login realizado com sucesso" imediato.
Porém, no contexto rigoroso do Open Banking brasileiro e do padrão FAPI, passar credenciais ou códigos de autorização na Query String é considerado um vazamento de dados em potencial. O código pode acabar logado em servidores proxy, guardado no histórico do navegador ou vazado no cabeçalho Referer caso a página faça qualquer redirecionamento subsequente para recursos externos.
A solução tecnicamente correta, que muitas vezes quebra o design de loading states, é o uso do Fragmento de URL (o que vem depois do #). Os dados no fragmento não são enviados para o servidor no request HTTP, ficando restritos ao cliente (navegador/app). Isso exige que o front-end execute um processamento extra para extrair o código antes de enviá-lo ao backend. O teste de conformidade rejeita qualquer implementação onde o código transitou pela Query String, obrigando a arquitetura a mudar e o designer a lidar com um pequeno atraso no processamento local, algo que muitas vezes resulta em telas de carregamento adicionais para gerenciar a extração do token do fragmento.
Uma das maiores queixas de usuários em fluxos de autorização é o erro por tempo expirado ou token inválido. Para mitigar isso, UXs frequentemente desenham fluxos de "Tentativa simplificada". Se o usuário clica em "Voltar" no banco ou cancela a operação por engano, o aplicativo iniciador (TPP) tenta manter a sessão viva, reutilizando o mesmo consent_id ou estado prévio para permitir que ele clique apenas em "Autorizar novamente" sem preencher tudo de novo.
Essa funcionalidade é eliminada com severidade nos testes de segurança do Open Banking. Os protocolos OAuth 2.0 e FAPI exigem que os tokens de autorização sejam de uso único (single-use). Se um código foi gerado e utilizado (ou expirou), ele morre. Tentar reiniciar o fluxo com o mesmo identificador de consentimento sem passar por uma nova validação e criação de recurso abre a porta para ataques de replay (repetição), onde um atacante intercepta a requisição e tenta reutilizá-la.
O teste valida rigorosamente se o servidor de autorização do banco rejeita a reutilização. O resultado prático para a interface é a impossibilidade de ter um botão "Tentar de novo" que funcione de forma "mágica". O usuário precisa, inevitavelmente, passar por uma nova etapa de iniciação, gerando um novo consent_id e muitas vezes passando por autenticação forte novamente. O UX sofre, pois o fluxo se torna menos indulgente com erros de navegação, mas é o custo para impedir que um token interceptado seja usado duas vezes.
Para oferecer uma experiência "app nativo", muitos times implementam Deep Links (Links Universais no iOS ou App Links no Android) que disparam o aplicativo do banco automaticamente assim que o usuário toca em um botão na fintech. O desejo da UX é que isso seja instantâneo e transparente, sem a "quebra" de abrir o navegador mobile e depois redirecionar.
Onde isso falha na auditoria? Na implementação preguiçosa que não valida a assinatura digital do aplicativo que está recebendo a chamada. Em 2026, os testes de segurança simulam ataques onde um aplicativo malicioso, instalado no mesmo celular, se registra para receber aquele Deep Link. Se a validação do assetlinks.json (Android) ou AASA (iOS) não estiver perfeita e rigorosamente checada, o teste consegue injetar o redirecionamento para o app falso. O app falso, por sua vez, captura as credenciais ou o token de acesso do usuário, que acha que está no banco oficial.
Para passar no teste, a instituição deve garantir uma verificação criptográfica da origem do Deep Link. Isso significa sacrificar certas implementações de redirecionamento "genéricas" ou de baixo código que priorizam a velocidade de desenvolvimento em detrimento da verificação de assinatura. O resultado é que, às vezes, o fluxo precisa cair para o navegador nativo (Chrome/Safari) como intermediário seguro, pois o navegador gerencia melhor a validação de domínios e certificados SSL do que um Deep Link mal configurado. Para o usuário final, isso significa uma transição de apps menos fluida, visualmente mais óbvia, mas tecnicamente blindada.
A balança pende para a segurança porque, no ambiente financeiro atual, a confiança é o ativo mais valioso. Remover esses atalhos não é apenas burocracia; é a barreira que impede que velhos hábitos de scraping de dados ou novas formas de phishing se instalem no ecossistema. Designers e PMs precisam internalizar que, no Open Banking, a usabilidade ideal não é a que tem menos cliques, mas a que garante que o token viaje apenas entre o dono da conta e a instituição autorizada, sem espectadores no meio do caminho. A agilidade da atualização desses dados, como na atualização em segundos de uma transação PIX, depende dessa integridade estrutural.