Li todos os seguintes RFCs:
[2]: RFC 8252: OAuth 2.0 para aplicativos nativos (observe que isso inclui não apenas aplicativos móveis, mas também aplicativos de desktop.)
[3]: rascunho RFC: OAuth 2.0 para aplicativos baseados em navegador
[3] recomenda o uso de uma das seguintes arquiteturas para aplicações baseadas em navegador:
Backend For Frontend (BFF), no qual o backend faz proxy de todas as solicitações relacionadas ao OAuth 2.0, incluindo acesso a servidores de recursos. Nenhum token (não criptografado) é exposto no lado do cliente.
Token-Mediating Backend (TMB), no qual apenas o backend armazena tokens de atualização, enquanto os tokens de acesso são expostos no lado do cliente.
Cliente OAuth 2.0 baseado em navegador, no qual nenhum backend é envolvido no OAuth 2.0. Cada token é exposto no lado do cliente.
[3] também recomenda o padrão BFF especialmente para aplicações sensíveis:
Essa arquitetura é altamente recomendada para aplicativos comerciais, aplicativos confidenciais e aplicativos que lidam com dados pessoais.
Pelo contrário, [2] (em todo o RFC, mas especialmente na Seção 4.1 ) refere-se apenas à arquitetura onde nenhum backend está envolvido no OAuth 2.0, o que corresponde conceitualmente ao padrão de cliente OAuth 2.0 baseado em navegador acima.
Mas por quê? Tenho essas três perguntas:
É recomendado usar o padrão BFF também para aplicativos nativos?
Existe alguma fonte formal (como outro RFC) para apoiar sua resposta?
Por que [2] não se refere ao padrão BFF? Talvez a razão seja que o ambiente de execução de aplicativos nativos é muito mais seguro do que o de aplicativos baseados em navegador, nos quais os invasores podem injetar e executar códigos JavaScript maliciosos, mas acho que teoricamente também é possível fazer coisas semelhantes para aplicativos nativos (especialmente para aplicativos de desktop) por técnicas como patching binário ou edição de memória.
É recomendado usar o padrão BFF também para aplicativos nativos?
Eu diria que não, mas há ressalvas que tento explicar abaixo. BFF é um termo sobrecarregado. Eu começaria entendendo o ambiente de execução e os problemas que você quer que um BFF resolva.
Para um aplicativo baseado em navegador, um BFF que emite cookies seguros garante que os tokens não possam ser exfiltrados e, assim, limita o impacto de explorações de XSS.
Para um aplicativo nativo, usarei um exemplo em que você deseja manter os tokens retornados aos dispositivos confidenciais, pois isso também pode ser uma motivação para um BFF, para impedir que o aplicativo ou outras partes leiam dados em tokens de acesso JWT.
Soluções para ambos podem usar componentes de backend, mas há grandes diferenças. Normalmente, o termo BFF é usado no contexto de aplicativos baseados em navegador e não em aplicativos nativos.
Existe alguma fonte formal (como outro RFC) para apoiar sua resposta?
A introdução ao OAuth para aplicativos baseados em navegador aponta as grandes diferenças entre ambientes de execução entre aplicativos nativos e de navegador.
Não há documentos do IETF que discutam um BFF para aplicativos nativos. Mas os documentos sobre OAuth Token Introspection e JWT Response podem ser usados em um caso de uso nativo que exija lógica BFF.
Por que [2] não se refere ao padrão BFF?
Para entender o porquê, vamos analisar os problemas que um BFF resolve para aplicativos baseados em navegador, onde um componente de servidor auxilia o frontend em sua segurança:
Um BFF pode emitir cookies HTTP only que o navegador torna indisponíveis para o código JavaScript. O JavaScript também não pode ver o que está nos tokens de acesso, o que mantém esses dados confidenciais.
O BFF pode instruir o navegador sobre como lidar com cookies, por exemplo, para aplicar
SameSite=strict
CORS, para que o navegador permita que cookies sejam enviados somente do código em execução na origem precisa do aplicativo.Embora você possa usar um BFF para um aplicativo nativo, você não pode ocultar tokens ou cookies do código do aplicativo ou ditar para onde o frontend pode enviá-los. Em vez disso, um BFF para um aplicativo nativo pode introspectar tokens de acesso opacos e então encaminhar tokens de acesso JWT para APIs.
Resumo
Penso em uma solução BFF como aquela que envolve a implantação de um componente extra de emissão de cookie por aplicativo da web. Você não precisa fazer isso para aplicativos nativos.
Sempre que possível, eu gerenciaria tarefas como introspecção de token em um gateway de API, para aplicar tal lógica a múltiplas APIs. Algumas pessoas chamam esse tipo de solução de BFF.