3
respostas

Login com Google - OAuth2 - Aplicação em container - Erro 400: redirect_uri_mismatch - redirect_uri=http://app:8080/login/oauth2/code/google

Escrevi uma aplicação Web/Java/Spring que faz autenticação pelo Google.

Na máquina local, fui solicitado pelo Google a configurar em "URIs de redirecionamento autorizados" o URI: http://localhost:8080/login/oauth2/code/google . Funcional perfeitamente.

Porém, quando implantei em container no Google Cloud, o Google solicita que eu cadastre o seguinte URI:

Se você é o desenvolvedor do app, registre o URI de redirecionamento no Console do Google Cloud.
Detalhes da solicitação: redirect_uri=http://app:8080/login/oauth2/code/google flowName=GeneralOAuthFlow

Onde "app" é o nome do container.

Quando tento cadastrar esse uri, aparece a seguinte notificação: Redirecionamento inválido: é preciso usar um domínio que seja um domínio superior privado válido.

Já tentei adicionar um parâmetro de configuração no "application-prod.properties"
spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8080/login/oauth2/code/google
spring.security.oauth2.client.registration.google.redirect-uri=http://xuxu.com.br/login/oauth2/code/google
e nada.

Por favor, como posso resolver isso?

3 respostas

Olá Marcos.
O problema não é no Spring, e sim no ambiente onde sua aplicação está rodando.
Quando a aplicação roda dentro de um container Kubernetes/Cloud Run/Compute Engine, o Google OAuth não aceita um redirect_uri que contenha:

  • nome de container (ex.: http://app:8080/...)
  • hostname local
  • IP interno (ex.: 10.x.x.x)
  • qualquer domínio que não seja público e verificável

Seu service dentro do cluster está acessível via nome interno http://app:8080/, mas isso não é um domínio público.
O Google Identity Platform só redireciona para URIs:

  • iniciando com https
  • usando um domínio público válido (ex.: seusite.com, meuapp.cloud.goog)
  • ou localhost, APENAS para ambiente local

Logo, o Google nunca irá redirecionar para http://app:8080/....

Como resolver corretamente

  1. Coloque sua aplicação atrás de um endereço público
    Dependendo onde você implantou:
    Se estiver no Cloud Run
    Você terá uma URL pública do tipo:
https://NOME-DO-SERVIÇO-xxxxx.a.run.app

Então o redirect correto será:

https://NOME-DO-SERVIÇO-xxxxx.a.run.app/login/oauth2/code/google

Se estiver em Kubernetes (GKE)
Crie um Ingress com um domínio público:

https://meuapp.com/login/oauth2/code/google

Ou use o domínio padrão do GKE:

https://<ip>.nip.io/login/oauth2/code/google

O Google aceita *.nip.io pois resolve para IP público.

  1. Cadastre o redirect no Google Cloud Console
    Acesse:
    APIs & Services → Credentials → OAuth 2.0 Client IDs → Authorized redirect URIs
    Cadastre:
https://MEU_DOMINIO/login/oauth2/code/google
  1. Configure no Spring Boot
    application-prod.properties:
spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/google
spring.security.oauth2.client.registration.google.client-id=SEU_ID
spring.security.oauth2.client.registration.google.client-secret=SEU_SECRET
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth

E defina server.forward-headers-strategy=native se estiver atrás de um proxy:

server.forward-headers-strategy=native

O Spring automaticamente substituirá {baseUrl} pelo domínio público.
Você precisa expor a aplicação em um domínio público HTTPS (Cloud Run, Ingress no GKE, Load Balancer etc.), e então usar este domínio como redirect_uri.
Testa ai e avise o resultado.
Bons estudos.

Olá Ronaldo, muito obrigado pela ajuda. Mas resolvi adicionando a seguinte configuração no arquivo nginx.conf:

server_name app;

location / {
proxy_pass http://app:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

Olá Marcos.
Fico feliz que tenha encontrado a solução.
E mais feliz ainda que compartilhou como resolver conosco.
Pode ser util para quem ter as mesmas dificuldades.
Obrigado por compartilhar.
Bons estudos.