O gateway-service é o ponto de entrada único de todas as requisições. Além de rotear, ele exige a autenticação: antes de encaminhar qualquer requisição a um serviço protegido, ele verifica se há um cookie com um JWT válido e resolve a identidade de quem está chamando. Isso é feito por dois componentes — RouterValidator e AuthorizationFilter.
1. Como a autorização funciona
O Gateway usa o mecanismo de GlobalFilter do Spring Cloud Gateway. Toda requisição passa pelo AuthorizationFilter antes de ser roteada. O filtro segue esta árvore de decisão:
flowchart TD
A[Requisição recebida] --> B{RouterValidator\nisSecured?}
B -- Não --> C[Encaminha ao serviço]
B -- Sim --> D{Cookie\n__store_jwt_token\npresente?}
D -- Não --> E[401 Unauthorized]
D -- Sim --> F[POST /auth/solve\ncom o JWT]
F --> G{Token válido?}
G -- Não --> E
G -- Sim --> H[Adiciona o header id-account\nAdiciona o header Authorization]
H --> C
Quando o token é válido, o filtro enriquece a requisição encaminhada aos serviços downstream com dois headers:
Header
Valor
Finalidade
id-account
UUID da conta, vindo do token
Os serviços o usam para identificar quem está chamando
Authorization
Bearer <jwt>
Bearer token padrão para os serviços downstream
Isso significa que os microsserviços downstream nunca precisam ler JWTs por conta própria — o Gateway cuida disso e repassa a identidade resolvida como um header simples.
2. Sequência completa da requisição
sequenceDiagram
autonumber
actor User
User->>+Gateway: requisição com o cookie __store_jwt_token
Gateway->>+AuthorizationFilter: filter(exchange, chain)
AuthorizationFilter->>RouterValidator: isSecured.test(request)
RouterValidator-->>AuthorizationFilter: true
AuthorizationFilter->>AuthorizationFilter: lê o valor do cookie
AuthorizationFilter->>+Auth Service: POST /auth/solve (token)
Auth Service->>Auth Service: JwtService.getId(token)
Auth Service-->>-AuthorizationFilter: { idAccount: "..." }
AuthorizationFilter->>AuthorizationFilter: altera os headers da requisição
AuthorizationFilter->>-Gateway: chain.filter(mutated exchange)
Gateway->>-User: resposta do serviço
3. O módulo gateway-service
3.1 Repositório
Crie um novo repositório git para o serviço gateway e adicione-o como submódulo:
Use o Spring Initializr para gerar um projeto Maven com as seguintes configurações:
Group:store
Artifact:gateway-service
Package name:store.gateway
Packaging: Jar
Java: 25
Dependências a adicionar:
Gateway (spring-cloud-starter-gateway-server-webflux) — gateway reativo com suporte a roteamento e filtros
Reactive Web (spring-boot-starter-webflux) — stack reativa exigida pelo Spring Cloud Gateway
Lombok — redução de código repetitivo (boilerplate) em tempo de compilação
Stack reativa
O Spring Cloud Gateway roda sobre o Project Reactor (WebFlux), e não sobre a stack tradicional de servlets. É por isso que o AuthorizationFilter retorna Mono<Void> em vez de void, e que o cliente HTTP dentro dele usa WebClient em vez de RestTemplate.
Controller REST mínimo; expõe um endpoint de health check na raiz
RouterValidator
Guarda a lista de rotas abertas; fornece o predicado isSecured
AuthorizationFilter
Filtro global; valida o cookie com o JWT e enriquece a requisição
3.3 O RouterValidator em detalhe
O RouterValidator define quais rotas dispensam a autenticação. Ele as armazena como strings no formato "METHOD /path" e expõe o predicado isSecured. Uma requisição corresponde a uma rota aberta se o método HTTP e o caminho coincidirem (com suporte opcional ao curinga /**).
Qualquer requisição que não corresponda a essa lista faz isSecured retornar true, o que significa que o filtro vai exigir um cookie válido.
3.4 Configuração da aplicação
O application.yaml define a política de CORS e a tabela de rotas. As rotas mapeiam padrões de URL para os nomes de host dos serviços upstream (resolvidos dentro da rede do Docker Compose):
Pronto! A camada de segurança está completa. Toda requisição a uma rota protegida agora passa pelo Gateway, que valida o cookie com o JWT junto ao auth-service e encaminha a identidade resolvida aos serviços downstream — sem que nenhum serviço precise ler tokens por conta própria.