Depois de recuperar as credenciais de um usuário ou recuperar dicas de login, verifique se um token de ID está disponível para a credencial. Um token de ID é uma declaração assinada da identidade de um usuário que também contém informações básicas do perfil de um usuário, possivelmente incluindo um endereço de e-mail verificado pelo Google. Quando os tokens de ID estão disponíveis, é possível usá-los para autenticar com segurança o back-end do app ou para pular a etapa de verificação de e-mail ao criar uma conta.
Um token de ID fica disponível quando o ID de usuário de um objeto Credential
corresponde ao ID de usuário de uma Conta do Google conectada no dispositivo.
Para fazer login com um token de ID, primeiro recupere o token com o método getIdTokens
. Em seguida, envie o token de ID para o back-end do app. No back-end, verifique o token usando uma biblioteca de cliente das APIs do Google ou uma biblioteca JWT de uso geral.
Antes de começar
- Seu app precisa conseguir recuperar as credenciais de um usuário ou recuperar uma dica de login.
- É preciso chamar
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 for, chame getIdTokens
para recuperá-lo e envie para seu 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 assinatura do token e as declarações aud
, iss
e exp
.
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 seu 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 '+/' '-
Ou você pode examinar um token de ID que sabe ser válido para conseguir o hash SHA-512.
As bibliotecas JWT podem processar algumas dessas tarefas de verificação para você. Por exemplo, usando a biblioteca do Google Auth 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.