Depois de recuperar as credenciais de um usuário ou as dicas de login, verifique se há um token de ID disponível para a credencial. Um token de ID é uma declaração assinada da identidade de um usuário que também contém as informações básicas do perfil dele, possivelmente incluindo um endereço de e-mail verificado pelo Google. Quando os tokens de ID estiverem disponíveis, será possível usá-los para fazer a autenticação com segurança com o back-end do seu app ou pular a etapa de verificação de e-mail ao criar uma nova conta.
Um token de ID está disponível quando o ID de usuário de um objeto Credential
corresponde ao
ID do usuário de uma Conta do Google conectada no dispositivo.
Para fazer login com um token de ID, primeiro recupere esse token com o método
getIdTokens
. Em seguida, envie o token do ID para o back-end do app. No back-end, verifique
o token usando uma biblioteca de cliente da API do Google ou uma biblioteca JWT
de uso geral.
Antes de começar
- Seu app precisa ser capaz de recuperar as credenciais de um usuário ou recuperar uma dica de login.
- Chame
setAccountTypes(IdentityProviders.GOOGLE)
ao criar os 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 isso acontecer, chame getIdTokens
para recuperá-la e enviá-la
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 POST de HTTPS, verifique a assinatura do token e as declarações aud
, iss
e exp
dele.
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 do certificado de assinatura. É 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 '+/' '-
Também é possível gerar o hash SHA-512 examinando um token de ID válido.
As bibliotecas JWT podem processar 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.