FirexportBlog

Corrija os erros 10 e 28444 do Google Sign-In: Developer console is not set up correctly

O erro ApiException: 10 do antigo SDK do Google Sign-In e o [28444] Developer console is not set up correctly do Credential Manager são o mesmo problema de configuração. Eles indicam que o app que pede o login (o nome do pacote e o SHA-1 do certificado que assinou este build) ou o ID do cliente da Web que ele passou não corresponde ao que está registrado no projeto. O que se corrige é o registro, não o código. Comece verificando se o SHA-1 da chave que assinou o build que você está executando está no Firebase.

Em resumo

  • É o mesmo erro com outro nome. 10 é o DEVELOPER_ERROR do SDK antigo, e 28444 é a mensagem de mesmo significado que o Credential Manager retorna. A causa está no nome do pacote, no SHA-1 de assinatura ou no ID do cliente da Web. Diferenciar os erros
  • Registre o SHA-1 da chave que assinou o build em execução. A chave de depuração, a chave de upload e a chave de assinatura do app do Google Play são todas diferentes. SHA-1 por build
  • No serverClientId vai o ID do cliente da Web. Não o ID do cliente Android. O que colocar
  • O SDK antigo foi removido em agosto de 2026. No Credential Manager, o mesmo erro de configuração também pode parecer um cancelamento feito pelo usuário. Ao migrar

Como diferenciar os erros

ErroOnde apareceO que significa
ApiException: 10O antigo Google Sign-In for AndroidDEVELOPER_ERROR. O app está configurado incorretamente.
[28444] Developer console is not set up correctly.Credential Manager. No google_sign_in 7 do Flutter, GoogleSignInExceptionCode.unknownErrorCódigo não documentado. Como diz a mensagem, a configuração do OAuth não corresponde ao app.
Cancelado sem o usuário cancelarCredential Manager (GetCredentialCancellationException, canceled no Flutter)Às vezes, erros de configuração são informados como cancelamento.
ApiException: 12500O antigo Google Sign-In for AndroidSegundo a documentação do Firebase, o e-mail de suporte não foi informado ou está faltando uma chave SHA.
NoCredentialExceptionCredential ManagerNão é um problema de configuração. O dispositivo não tem uma Conta do Google, ou a solicitação está configurada para mostrar só as contas que já fizeram login neste app (veja abaixo).

Os três primeiros têm as mesmas causas. A documentação do plug-in do Flutter (google_sign_in_android) aponta como causas comuns de erros de configuração um SHA de assinatura ausente ou incorreto em algum build, um nome de pacote incorreto no lado do servidor e um serverClientId ausente ou incorreto. Verifique nessa ordem.

O SHA-1 da chave que assinou este build

O Google reconhece o app que pede o login pelo nome do pacote e pelo SHA-1 do certificado que assinou o APK. O nome do pacote é o applicationId do build.gradle (incluindo o sufixo que o tipo de build acrescenta), e ele precisa ser igual ao do app Android registrado no Firebase. A assinatura depende de como o app foi instalado.

Build instaladoAssinado comOnde ver o SHA-1
Build de depuração executado pelo Android StudioO keystore de depuração deste computador (muda de um computador para outro)A entrada debug do signingReport
Build de lançamento que você mesmo assinou e instalouSua chave de upload (de lançamento)A entrada release do signingReport
App instalado pelo Google Play (qualquer faixa)A chave de assinatura do app mantida pelo GoogleA página Gerenciar a Assinatura de apps do Google Play (Manage Play app signing) do Play Console
App instalado pelo Compartilhamento interno de apps (Internal app sharing)O certificado de teste interno do Google PlayCertificado de teste interno (Internal test certificate), na página Compartilhamento interno de apps do Play Console
# Every build variant's signing key, from the project root
./gradlew signingReport

# The debug keystore (password: android)
keytool -list -v -alias androiddebugkey -keystore ~/.android/debug.keystore

# The certificate that signed an APK or AAB you already have
keytool -printcert -jarfile app-release.aab

Adicione o SHA-1 encontrado às impressões digitais do certificado SHA (SHA certificate fingerprints) do app Android em Configurações do projeto (Project settings) > Geral (General) > Seus apps (Your apps), no console do Firebase, e baixe o google-services.json de novo para substituir o seu. O Firebase cria o cliente OAuth do Android para essa impressão digital. Se você registrar todas as chaves que usa, o login funciona seja qual for a forma de instalação do app.

  • Se funciona quando você instala direto, mas falha quando o app vem do Google Play, falta a chave de assinatura do app. O Google Play assina o app de novo com a chave de assinatura do app mantida pelo Google, não com a sua chave de upload.
  • Apps novos são assinados por padrão pelo Google Play com três chaves (assinatura protegida contra ataques quânticos). Nesse caso, a Ajuda do Play Console orienta a registrar as três impressões digitais nos provedores de API.
  • Um par de nome do pacote e SHA-1 só pode ser registrado em um projeto, considerando todos os projetos do Firebase e do Google Cloud. Se você usa projetos separados para desenvolvimento e produção, dê a cada build um nome de pacote próprio.

No serverClientId vai o ID do cliente da Web

O serverClientId recebe o ID do cliente OAuth do aplicativo da Web no seu projeto do Google Cloud. É o valor usado como público-alvo (audience) dos tokens de ID do Google, por isso o ID do cliente Android não serve. Num projeto do Firebase, é a entrada com client_type 3 no google-services.json, que o plug-in google-services transforma em R.string.default_web_client_id.

// Android (Kotlin): the Sign in with Google button
val buttonOption = GetSignInWithGoogleOption.Builder(
    serverClientId = getString(R.string.default_web_client_id),
).build()

// Android (Kotlin): the bottom sheet, offering every account on the device
val sheetOption = GetGoogleIdOption.Builder()
    .setServerClientId(getString(R.string.default_web_client_id))
    .setFilterByAuthorizedAccounts(false)
    .build()

// Flutter (google_sign_in 7), without google-services.json
await GoogleSignIn.instance.initialize(
  serverClientId: 'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com',
);
  • O google_sign_in 7 do Flutter lê esse valor mesmo sem serverClientId quando o google-services.json tem uma entrada de cliente da Web. Se não tiver, adicione um app da Web ao projeto do Firebase e baixe o arquivo de novo. No Android, o clientId não é usado.
  • Se o 28444 apareceu pela primeira vez depois de atualizar do 6.x para o 7, desconfie do serverClientId. A equipe do Flutter explica que o SDK antigo usado pelo 6.x nem sempre validava esse valor, então um valor errado pode ter funcionado (flutter/flutter #174319).

Ao migrar do SDK antigo para o Credential Manager

As APIs do antigo Google Sign-In for Android foram removidas no play-services-auth 22.0.0 (26 de agosto de 2026). Nessa versão ou em uma posterior, o código de login feito com GoogleSignInClient não compila, então migre para o Credential Manager.

SDK antigoCredential Manager
A tela de login do GoogleSignInClientGetSignInWithGoogleOption (botão) ou GetGoogleIdOption (página inferior)
silentSignIn()GetGoogleIdOption com setFilterByAuthorizedAccounts(true) e setAutoSelectEnabled(true)
requestIdToken(webClientId)O mesmo ID do cliente da Web no serverClientId
signOut()clearCredentialState()
ApiException: 10[28444] Developer console is not set up correctly ou um cancelamento
  • O valor padrão de setFilterByAuthorizedAccounts é true. Usuários que nunca fizeram login neste app recebem NoCredentialException, então, no cadastro e no primeiro login, use false ou o fluxo do botão.
  • No emulador, faça login numa Conta do Google. Use uma imagem do sistema com Google APIs. Sem nenhuma conta no dispositivo, ocorre NoCredentialException.

Fontes

Todos os posts →