Automatycznie loguj użytkowników w swojej aplikacji za pomocą interfejsu Credentials API do wysyłania żądań i pobierania zapisanych danych logowania.
Zanim zaczniesz
Skonfiguruj projekt Android Studio.
Tworzenie obiektu CredentialsClient
Aby zażądać przechowywanych danych logowania, musisz utworzyć instancję CredentialsClient
w celu uzyskania dostępu do interfejsu Credentials API:
CredentialsClient mCredentialsClient;
// ...
mCredentialsApiClient = Credentials.getClient(this);
Tworzenie obiektu CredentialRequest
Obiekt CredentialRequest
określa systemy logowania, do których chcesz zażądać danych logowania. Utwórz CredentialRequest
za pomocą metody setPasswordLoginSupported
do logowania opartego na haśle i metody setAccountTypes()
na potrzeby sfederowanych usług logowania, takich jak Logowanie przez Google.
mCredentialRequest = new CredentialRequest.Builder()
.setPasswordLoginSupported(true)
.setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
.build();
Aby określić często wybieranych dostawców logowania, użyj stałych określonych w polu IdentityProviders
. W przypadku innych dostawców logowania użyj dowolnego ciągu, który jednoznacznie identyfikuje dostawcę. Do przechowywania danych logowania musisz używać tego samego identyfikatora dostawcy.
Poproś o zapisane dane logowania
Po utworzeniu obiektów CredentialsClient
i CredentialRequest
przekaż obiekt żądania do metody CredentialsClient.request()
, aby zażądać danych logowania zapisanych w 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"
// ...
}
});
Określ wywołanie zwrotne do obsługi udanych i nieudanych żądań za pomocą metody addOnCompleteListener()
.
Obsługa udanych żądań danych logowania
Po pomyślnym żądaniu danych logowania użyj wynikowego obiektu Credential
, aby dokończyć logowanie użytkownika w aplikacji. Użyj metody getAccountType()
, aby określić typ pobranych danych logowania, a następnie przejdź odpowiedni proces logowania. Na przykład w przypadku logowania przez Google utwórz obiekt GoogleSignInClient
zawierający identyfikator użytkownika, a następnie użyj go do uruchomienia procesu logowania. W przypadku logowania opartego na haśle dokończ proces logowania się w aplikacji, używając identyfikatora i hasła użytkownika z obiektu Credential.
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
Jeśli do wybrania danych logowania wymagane jest wprowadzenie danych wejściowych użytkownika, zadanie request()
zakończy się błędem ResolvableApiException
. Sprawdź, czy getStatusCode()
zwraca wartość RESOLUTION_REQUIRED
, i wywołuj metodę startResolutionForResult()
wyjątku, aby prosić użytkownika o wybranie konta. Następnie pobierz wybrane przez użytkownika dane logowania za pomocą metody onActivityResult()
aktywności, przekazując Credential.EXTRA_KEY
do metody 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 będą musieli utworzyć konto lub zalogować się ręcznie. Jeśli getStatusCode()
zwraca SIGN_IN_REQUIRED
, możesz opcjonalnie przyspieszyć proces rejestracji i logowania, prosząc użytkownika o wybranie ostatnio używanych danych logowania, takich jak adres e-mail i imię i nazwisko, oraz automatycznie wypełnij niektóre pola formularzy tymi informacjami.
Więcej informacji znajdziesz w sekcji Udostępnianie użytkownikowi wskazówek dotyczących logowania.
Po zalogowaniu się zezwalaj użytkownikom na zapisywanie swoich danych logowania, aby zautomatyzować przyszłe uwierzytelnianie na wszystkich urządzeniach.