Depois de recuperar as credenciais de um usuário ou dicas de login recuperadas, você pode verificar se um token de ID está disponível para a credencial. Um token de ID é um declaração assinada da identidade de um usuário que também contém o perfil básico de um usuário do usuário, incluindo um endereço de e-mail que tenha sido verificado pelo Google. Quando os tokens de ID estiverem disponíveis, eles poderão ser usados para autenticar com o back-end do app ou pular a etapa de verificação de e-mail ao criar uma nova conta.
Um token de ID fica disponível quando o ID do usuário de um objeto Credential
corresponde ao usuário
ID de uma Conta do Google conectada ao dispositivo.
Para fazer login com um token de ID, primeiro recupere o token de ID com o getIdTokens
. Em seguida, envie o token de ID para o back-end do app. No back-end, verifique
o token usando uma biblioteca cliente de APIs do Google ou um JWT de uso geral
biblioteca.
Antes de começar
- O app precisa conseguir recuperar as credenciais de um usuário. ou recuperar uma dica de login.
- Você precisa chamar
setAccountTypes(IdentityProviders.GOOGLE)
ao criar o objetosCredentialRequest
eHintRequest
.
Receber um token de ID do objeto Credentials
Depois de recuperar as credenciais de um usuário, verifique se o objeto Credentials
inclui um token de ID. Se ela tiver, chame getIdTokens
para recuperar e enviar essa informação
ao back-end por HTTPS POST.
if (!credential.getIdTokens().isEmpty()) {
String idToken = credential.getIdTokens().get(0).getIdToken();
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("https://yourbackend.example.com/tokensignin");
try {
List nameValuePairs = new ArrayList(1);
nameValuePairs.add(new BasicNameValuePair("idToken", idToken));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
final String responseBody = EntityUtils.toString(response.getEntity());
Log.i(TAG, "Signed in as: " + responseBody);
}
}
Verificar o token de ID no back-end
Depois de receber o token de ID por HTTPS POST, verifique a propriedade
assinatura e verifique as declarações aud
, iss
e exp
do token.
A declaração aud
de um token de ID do Smart Lock para senhas tem o seguinte
formato:
android://SHA512_HASH@ANDROID_PACKAGE_NAME
O valor SHA512HASH é o hash SHA-512 da sua assinatura
certificado. É possível conseguir esse valor usando os utilitários keytool
e openssl
:
keytool -exportcert -keystore path-to-keystore -alias key-name
'
| openssl sha -sha512 -binary
| base64 -w 0
| tr '+/' '-
Ou você pode obter o hash SHA-512 examinando um token de ID que sabe ser válido.
As bibliotecas JWT podem lidar com algumas dessas tarefas de verificação para você. Por exemplo: usando a biblioteca de cliente das APIs do Google para Java:
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
...
// Verifier that checks that the token has the proper issuer and audience,
// and hasn't expired
private static GoogleIdTokenVerifier verifier =
new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
.setAudience(Arrays.asList(String.format("android://%s@%s", SHA512_HASH, PACKAGE_NAME)))
.build();
// (Receive idTokenString by HTTPS POST)
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
System.out.println("User email: " + payload.getEmail());
if (payload.getEmailVerified()) {
System.out.println("Email verified by Google.");
}
} else {
System.out.println("Invalid ID token.");
}
Consulte a documentação do Login do Google. para mais detalhes.