Autenticação Google no Android¶
Visão geral¶
O backend continua sendo o dono do fluxo OAuth, mas o app Android usa o SDK nativo para gerar o id_token. Esse token é enviado ao servidor, que valida o audience contra os Client IDs confiáveis (web + Android) e cria os JWTs internos. O deep link que o app deseja usar é repassado na requisição e devolvido na resposta.
Configuração no Console do Google¶
- Acesse Credentials no Console do Google Cloud.
- Crie um OAuth Client ID do tipo Android associando o
packagee o digest SHA-256 da assinatura usada no app (debug ou release). - Copie esse Client ID e defina a variável de ambiente
GOOGLE_ANDROID_CLIENT_IDno backend (ou no.envde desenvolvimento). - O backend aceita os auds configurados em
GOOGLE_CLIENT_IDeGOOGLE_ANDROID_CLIENT_ID, liberando oid_tokenemitido pela SDK Android.
Fluxo dentro do app Android¶
- Use o Google Sign-In SDK para solicitar um ID Token (
requestIdToken(yourWebClientId)), não apenas ocode. - Ao receber o
id_token, monte uma requisição JSON que contenha:{ "id_token": "<ID_TOKEN>", "redirect_url": "billings-ease://auth/oauth/callback/google" } - O
redirect_urlé opcional, mas deve ser o deep link que o app quer abrir ao final do fluxo (e que também existe no handler mobile do backend). - Faça um
POSTparahttps://{BACKEND_URL}/api/auth/oauth/mobile/googlecom o corpo acima. - A resposta contém os tokens do sistema:
{ "token": "...", "refresh_token": "...", "redirect_url": "billings-ease://auth/oauth/callback/google" } - Use os valores
tokenerefresh_tokencomo sessão no app e, se quiser, abra oredirect_url(deep link) para entregar o usuário ao fluxo normal.
Tratamento de erros¶
- Se o token for inválido ou não for emitido para um client confiável, o backend retorna
OAUTH_ERRORcomstatus 500. - Dispare novas tentativas apenas se for um erro transitório; não repita casos de
INVALID_CLIENTouUSER_INACTIVE.
Considerações adicionais¶
- O Android nunca precisa do
client_secret; o backend continua usandoGOOGLE_CLIENT_ID+GOOGLE_CLIENT_SECRETpara o fluxo web. - O deep link final pode ser diferente dependendo do ambiente (debug, release). Ajuste o
redirect_urlenviado para combinar com o que o app espera.