Autenticação Google OAuth para Mobile¶
Este guia resume as responsabilidades do backend e os passos para seguir para autorizar usuários com o Google, seguindo o fluxo OAuth/OIDC já implementado.
1. Fluxo geral¶
- Pedir URL de autorização
- Chamar
GET /api/auth/oauth/googlee incluir o parâmetroredirect_urlcom o valor deEXPO_PUBLIC_OAUTH_REDIRECT_URL(ex:billings-ease://auth/oauth/callback/google). - O backend devolve
auth_url,stateecode_verifier(PKCE). O handler está embillings-ease-backend/internal/handlers/auth/oauth.go(StartLogin) e usainternal/services/oauth/provider.gopara gerar o state/PKCE. O serviço aceitaredirect_urlapenas quando ele corresponde aMOBILE_FRONTEND_URL, garantindo a escolha correta entre web e mobile. - Abrir o
auth_url - Abrir o link em um browser externo (
AuthSession, Chrome Custom Tabs, etc.). - O Google pede permissão e, quando aprovado, redireciona para
/api/auth/oauth/callback/googlecomcodeestate. - Callback do backend
internal/handlers/auth/oauth.govalidastate, troca ocodepor tokens eminternal/services/oauth/provider.go, valida o ID Token e cria/atualiza o usuário (UserAuthProvider).- Os JWTs são enviados para o frontend/mobile via
redirectToFrontendWithTokens, que faz um302paraFRONTEND_URL/auth/oauth/callback/googlecomtokenerefresh_tokenno fragment (#token=...&refresh_token=...). - Receber os tokens no mobile
- No mobile, registre o deep link
FRONTEND_URL(ex:billings-ease://auth/oauth/callback/google) para interceptar a navegação e extrair o fragmento. - Guarde os tokens em armazenamento seguro (
SecureStore, etc.) e configure o interceptor HTTP para injetarAuthorization: Bearer <token>. - Em caso de
401, limpe os tokens e force o usuário ao login.
O fluxo completo, incluindo a troca do código, validações e criação de usuários, está documentado em
billings-ease-documentation/docs/02-backend/integracoes.mde embillings-ease-documentation/docs/02-backend/api.md.
2. Endpoints e campos importantes¶
GET /api/auth/oauth/google- Resposta:
{ auth_url, state, code_verifier } - Documento:
billings-ease-documentation/docs/02-backend/api.mdeintegracoes.md. GET /api/auth/oauth/callback/google- Recebe
code+state. - Redireciona para
FRONTEND_URL/auth/oauth/callback/googlecom tokens no fragment. POST /api/auth/refresh- Usa o
refresh_tokenpara gerar novo JWT de acesso.
3. Arquivos-chave no backend¶
internal/handlers/auth/oauth.go: handlersStartLogin,Callback, validadores de state/CSRF e redirecionamento para o frontend.internal/services/oauth/provider.go: registra os providers, gerastate+ PKCE, armazena temporariamente nostateStore(substituível por Redis em produção) e executaHandleCallback.internal/services/oauth/google_provider.go: define os endpoints do Google, troca de código e validação deid_token/claims (sub,email,name,picture).internal/models/user_auth_provider.goe repositórios relacionados: armazenam associações entre usuários e provedores externos.billings-ease-documentation/docs/02-backend/auth.md: explica armazenamento seguro e interceptors específicos mobile (SecureStore + interceptors de 401).
4. Variáveis de ambiente necessárias¶
GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETGOOGLE_REDIRECT_URL(ex:https://api.billings-ease.com/api/auth/oauth/callback/google)FRONTEND_URLdefine para onde o backend manda os tokens para o frontend webMOBILE_FRONTEND_URLdeve ser o deep link usado pelo app (ex:billings-ease://auth/oauth/callback/google)EXPO_PUBLIC_OAUTH_REDIRECT_URL(no .env do mobile) precisa bater comMOBILE_FRONTEND_URLpara que o mobile informe o deep link ao backend
Para desenvolvimento local use os valores descritos em billings-ease-documentation/docs/07-guides/desenvolvimento-local.md.
5. PKCE / Segurança¶
- O backend gera
code_verifierecode_challengeeminternal/services/oauth/provider.go. - O
code_verifierretornado no início deve ser guardado no mobile até o callback, mas o backend também armazena nostateStore(PKCE server-side). Isso garante que apenas o app que pediu o login possa completar o fluxo. statedeve ser validado (CSRF). Se for inválido, o handler redirecionará o usuário com erro consultandoredirectToFrontendWithError.
6. Deep link e captura dos tokens¶
- Configure o valor de
FRONTEND_URLpara o esquema usado pelo app (ex:billings-ease://auth/oauth/callback/google). - Após o redirecionamento, o app lê o fragmento (
#token=...&refresh_token=...) e armazena os tokens. - Opcionalmente, extraia
statedo backend para validar no mobile (a mesma string pode ser usada para emparelhar requests, mas o backend já verifica o recebido do Google).
7. Referências¶
billings-ease-documentation/docs/02-backend/api.md(endpoints OAuth)billings-ease-documentation/docs/02-backend/integracoes.md(fluxo completo)billings-ease-documentation/docs/02-backend/auth.md(armazenamento seguro no mobile)billings-ease-backend/internal/handlers/auth/oauth.gobillings-ease-backend/internal/services/oauth/provider.go