Faça o login automático dos usuários no seu app usando a API Credentials para solicitar e recuperar credenciais armazenadas para seus usuários.
Antes de começar
Configure um projeto do Android Studio.
Criar um objeto CredentialsClient
Para solicitar credenciais armazenadas, crie uma instância de
CredentialsClient
para acessar a API Credentials:
CredentialsClient mCredentialsClient;
// ...
mCredentialsApiClient = Credentials.getClient(this);
Criar um objeto CredentialRequest
Um objeto CredentialRequest
especifica os
sistemas de login dos quais você quer solicitar credenciais. Crie um
CredentialRequest
usando o método setPasswordLoginSupported
para
login baseado em senha e o método setAccountTypes()
para serviços de
login federados, como o Login do Google.
mCredentialRequest = new CredentialRequest.Builder()
.setPasswordLoginSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
.build();
Use as constantes definidas em IdentityProviders
para especificar os provedores de login mais usados. Para outros provedores de login, use qualquer
string que identifique o provedor de forma exclusiva. Para armazenar as credenciais e recuperá-las, use o mesmo identificador de provedor.
Solicitar credenciais armazenadas
Depois de criar os objetos CredentialsClient
e CredentialRequest
, transmita o objeto de solicitação
ao método CredentialsClient.request()
para solicitar credenciais armazenadas para seu app.
mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
new OnCompleteListener<CredentialRequestResponse>() {
@Override
public void onComplete(@NonNull Task<CredentialRequestResponse> task) {
if (task.isSuccessful()) {
// See "Handle successful credential requests"
onCredentialRetrieved(task.getResult().getCredential());
return;
}
// See "Handle unsuccessful and incomplete credential requests"
// ...
}
});
Defina um callback para processar solicitações bem-sucedidas e com falha usando o
método addOnCompleteListener()
.
Processar solicitações de credenciais bem-sucedidas
Em uma solicitação de credencial bem-sucedida, use o objeto
Credential
resultante para concluir o login do usuário no app. Use o método getAccountType()
para determinar o tipo de credenciais recuperadas e conclua o processo de login
adequado. Por exemplo, para o Login do Google, crie um objeto GoogleSignInClient
que
inclua o ID do usuário e use o objeto para iniciar o fluxo de login. Para login baseado
em senha, use o ID e a senha do usuário do objeto Credential para concluir o processo
de login do app.
private void onCredentialRetrieved(Credential credential) {
String accountType = credential.getAccountType();
if (accountType == null) {
// Sign the user in with information from the Credential.
signInWithPassword(credential.getId(), credential.getPassword());
} else if (accountType.equals(IdentityProviders.GOOGLE)) {
// The user has previously signed in with Google Sign-In. Silently
// sign in the user with the same ID.
// See https://developers.google.com/identity/sign-in/android/
GoogleSignInOptions gso =
new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.build();
GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
Task<GoogleSignInAccount> task = signInClient.silentSignIn();
// ...
}
}
Processar várias credenciais salvas
Quando a entrada do usuário é necessária para selecionar uma credencial, a tarefa request()
falha com um ResolvableApiException
. Verifique se
getStatusCode()
retorna RESOLUTION_REQUIRED
e
chame o método startResolutionForResult()
da exceção para solicitar que o usuário
escolha uma conta. Em seguida, extraia as credenciais escolhidas pelo usuário do
método onActivityResult()
da atividade transmitindo Credential.EXTRA_KEY
para o
método
getParcelableExtra()
.
mCredentialsClient.request(request).addOnCompleteListener( new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { if (task.isSuccessful()) { // ... return; } Exception e = task.getException(); if (e instanceof ResolvableApiException) { // This is most likely the case where the user has multiple saved // credentials and needs to pick one. This requires showing UI to // resolve the read request. ResolvableApiException rae = (ResolvableApiException) e; resolveResult(rae, RC_READ); } else if (e instanceof ApiException) { // The user must create an account or sign in manually. Log.e(TAG, "Unsuccessful credential request.", e); ApiException ae = (ApiException) e; int code = ae.getStatusCode(); // ... } } });
private void resolveResult(ResolvableApiException rae, int requestCode) {
try {
rae.startResolutionForResult(MainActivity.this, requestCode);
mIsResolving = true;
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Failed to send resolution.", e);
hideProgress();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// ...
if (requestCode == RC_READ) {
if (resultCode == RESULT_OK) {
Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
onCredentialRetrieved(credential);
} else {
Log.e(TAG, "Credential Read: NOT OK");
Toast.makeText(this, "Credential Read Failed", Toast.LENGTH_SHORT).show();
}
}
// ...
}
Quando as credenciais armazenadas não são encontradas, os usuários precisam criar uma conta ou fazer login
manualmente. Se getStatusCode()
retornar SIGN_IN_REQUIRED
,
será possível acelerar os processos de inscrição e login solicitando que o
usuário escolha as informações de login usadas recentemente, como endereço de e-mail e
nome, e preenchendo automaticamente alguns campos dos formulários com essas informações.
Consulte Fornecer dicas de login a um usuário
para saber mais.
Após o login, permita que os usuários salvem as credenciais para automatizar a autenticação futura em todos os dispositivos.