Faça login dos usuários automaticamente no 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, você deve criar uma instância de
CredentialsClient
para acessar a API Credentials:
CredentialsClient mCredentialsClient;
// ...
mCredentialsApiClient = Credentials.getClient(this);
Criar um objeto CredentialRequest
Um objeto CredentialRequest
especifica o
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 registros
serviços de login, como o Login do Google.
mCredentialRequest = new CredentialRequest.Builder()
.setPasswordLoginSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
.build();
Usar as constantes definidas em IdentityProviders
para especificar os provedores de login mais usados. Para outros provedores de login, use qualquer
string que identifica exclusivamente o provedor. Use o mesmo identificador de provedor
para armazenar as credenciais enquanto você as usa para recuperá-las.
Solicitar credenciais armazenadas
Depois de criar os objetos CredentialsClient
e CredentialRequest
, transmita o objeto da solicitação.
para o 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 lidar com solicitações bem-sucedidas e com falha usando o
addOnCompleteListener()
.
Processar solicitações de credenciais bem-sucedidas
Em uma solicitação de credencial bem-sucedida, use o
Credential
para concluir o login do usuário no seu app. Usar o método getAccountType()
para determinar o tipo de credenciais recuperadas e faça o login
de desenvolvimento de software. Por exemplo, para o Login do Google, crie um objeto GoogleSignInClient
que
incluir o ID do usuário e, em seguida, usar o objeto para iniciar o fluxo de login. Para senhas
login, use o ID e a senha do usuário do objeto Credential para concluir a
processo de login.
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 o usuário precisar inserir uma credencial para selecionar uma credencial, a tarefa request()
vai
falhar com um ResolvableApiException
. Verifique se
getStatusCode()
retorna RESOLUTION_REQUIRED
e
chamar o método startResolutionForResult()
da exceção para solicitar que o usuário
para escolher uma conta. Em seguida, recupere as credenciais escolhidas pelo usuário no
método onActivityResult()
da atividade transmitindo Credential.EXTRA_KEY
para o
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 criar
fazer login. Se getStatusCode()
retorna SIGN_IN_REQUIRED
,
você pode, opcionalmente, acelerar os processos de inscrição e login solicitando que
que o usuário escolha informações de login usadas recentemente, como endereço de e-mail e
e preenchendo automaticamente alguns campos dos formulários com essas informações.
Consulte Dar dicas de login para um usuário.
para mais detalhes.
Após o login, permitir que os usuários salvem as credenciais para automatizar a autenticação futura em todos os dispositivos.