Estou planejando implementar uma arquitetura onde:
O API Gateway interage com vários serviços e um aplicativo frontend Vue.js. O API Gateway cria suas próprias sessões vinculando solicitações de usuários a tokens armazenados. O frontend usa cookies de sessão para se comunicar com o API Gateway. A autenticação é tratada pelo Keycloak como o provedor SSO. O objetivo é manter o frontend inconsciente do token real, mantendo a segurança e a flexibilidade.
Fonte de inspiração: https://medium.com/@a.zagarella/microservices-architecture-a-real-business-world-scenario-c77c31a957fb
O artigo descreve o uso do Spring Cloud Gateway, mas no meu caso será o api gateway no golang.
Exemplo de uma solicitação de acesso a recursos protegidos em um Servidor de Recursos:
Quais são algumas das melhores práticas para implementar esse tipo de configuração? Há alguma armadilha potencial da qual eu deva estar ciente?
Essa abordagem parece semelhante ao que está descrito no artigo vinculado, mas gostaria de obter mais informações sobre como implementá-la de forma eficaz.
Forneça orientação sobre:
Como armazenar e gerenciar tokens com segurança no API Gateway Melhores práticas para gerenciamento de sessão entre o frontend e o API Gateway Como lidar com atualização e expiração de tokens Quaisquer considerações de segurança que eu deva ter em mente Estou particularmente interessado em como equilibrar segurança, facilidade de uso e escalabilidade nesta arquitetura.
Obrigado pela sua competência!
Essa abordagem de armazenar tokens no gateway (configurado como
oauth2Client
withoauth2Login
) e substituir a autorização baseada em cookie porBearer
uma baseada em enquanto roteia solicitações para servidores de recursos downstream (usando oTokenRelay
filtro) é frequentemente chamada de "OAuth2 BFF" (Backend-For-Frontend).Eu escrevi um artigo sobre isso no Baeldung . Ele contém todos os detalhes de implementação e um aplicativo Vue de exemplo (junto com Angular e React).
Sobre escalabilidade, como mencionado no artigo, você deve considerar usar o Spring Session (compartilhar dados de sessão entre instâncias de gateway usando Redis ou similar).
Em relação à atualização de tokens, o
TokenRelay
filtro e o Spring Security cuidarão disso para você.Uma vez que o BFF esteja configurado corretamente, o frontend usa apenas o cookie de sessão "padrão" e o token CSRF com os quais ele deve estar familiarizado, e os serviços downstream são servidores de recursos padrão. Então, nada complicado de nenhum dos lados. No entanto, há uma armadilha no caso do Vue que não lida com o token CSRF de forma transparente (como o Angular faz, por exemplo). Então, você terá que escrever algum código (um interceptador de solicitação?) para ler o
XSRF-TOKEN
valor do cookie e defini-lo comoX-XSRF-TOKEN
cabeçalho para todas as solicitaçõesPOST
,PUT
,PATCH
, eDELETE
para seu backend.