Automatycznie loguj użytkowników w aplikacji za pomocą interfejsu Credentials API do wysyłania żądań i odzyskiwanie zapisanych danych logowania użytkowników.
Zanim zaczniesz
Skonfiguruj projekt Android Studio.
Tworzenie obiektu CredentialsClient
Aby zażądać zapisanych danych logowania, musisz utworzyć instancję
CredentialsClient
, aby uzyskać dostęp do interfejsu Credentials API:
CredentialsClient mCredentialsClient;
// ...
mCredentialsApiClient = Credentials.getClient(this);
Tworzenie obiektu CredentialRequest
Obiekt CredentialRequest
określa wartość
systemów logowania, do których chcesz żądać danych logowania. Utwórz
CredentialRequest
za pomocą metody setPasswordLoginSupported
do
logowanie oparte na haśle oraz metoda setAccountTypes()
w przypadku sfederowanego
usług logowania, takich jak Logowanie przez Google.
mCredentialRequest = new CredentialRequest.Builder()
.setPasswordLoginSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
.build();
Użyj stałych określonych w polu IdentityProviders
.
, aby określić często wybieranych dostawców logowania. W przypadku innych dostawców logowania użyj dowolnej
ciąg jednoznacznie identyfikujący dostawcę. Musisz użyć tego samego identyfikatora dostawcy
do przechowywania danych logowania używanych do ich pobierania.
Żądanie zapisanych danych logowania
Po utworzeniu obiektów CredentialsClient
i CredentialRequest
przekaż obiekt żądania
do: CredentialsClient.request()
żądania danych logowania przechowywanych dla aplikacji.
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"
// ...
}
});
Zdefiniuj wywołanie zwrotne do obsługi udanych i nieudanych żądań za pomocą funkcji
Metoda addOnCompleteListener()
.
Obsługa udanych żądań danych logowania
W przypadku udanego żądania danych logowania użyj wynikowego
Credential
.
do ukończenia logowania użytkownika w aplikacji. Użyj metody getAccountType()
w celu określenia typu pobranych danych logowania, a następnie zaloguj się
proces tworzenia konta. Na przykład w przypadku Logowania przez Google utwórz obiekt GoogleSignInClient
, który
zawiera identyfikator użytkownika, a następnie użyj obiektu, aby rozpocząć proces logowania. Uwierzytelnianie oparte na haśle
logowania, użyj identyfikatora użytkownika i hasła z obiektu Credential, aby
logowania się.
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();
// ...
}
}
Obsługa wielu zapisanych danych logowania
Gdy dane logowania wymagają danych wejściowych użytkownika, zadanie request()
zakończy się niepowodzeniem (ResolvableApiException
). Sprawdź, czy
getStatusCode()
zwraca RESOLUTION_REQUIRED
i
wywołaj metodę startResolutionForResult()
wyjątku, aby poprosić użytkownika
aby wybrać konto. Następnie pobierz wybrane przez użytkownika dane logowania z
metody onActivityResult()
aktywności, przekazując Credential.EXTRA_KEY
do funkcji
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();
}
}
// ...
}
Jeśli zapisane dane logowania nie zostaną znalezione, użytkownicy muszą utworzyć konto lub ręcznie
zaloguj się. Jeśli getStatusCode()
zwraca SIGN_IN_REQUIRED
,
możesz opcjonalnie przyspieszyć proces rejestracji i logowania, prosząc o
użytkownik może wybrać ostatnio używane dane logowania, takie jak adres e-mail
i automatycznie wypełniać niektóre pola tymi informacjami.
Zapoznaj się z sekcją Przekazywanie użytkownikowi wskazówek dotyczących logowania.
.
Zezwalaj użytkownikom na zapisywanie danych logowania po zalogowaniu się automatyzacji przyszłego uwierzytelniania na wszystkich swoich urządzeniach.