אחזור פרטי הכניסה המאוחסנים של המשתמש

אפשר להכניס משתמשים לאפליקציה באופן אוטומטי באמצעות Credentials API, כדי לבקש ולאחזר פרטי כניסה שמורים עבור המשתמשים.

לפני שמתחילים

מגדירים פרויקט Android Studio.

יצירת אובייקט של CredentialsClient

כדי לבקש פרטי כניסה שמורים, צריך ליצור מכונה של CredentialsClient כדי לקבל גישה ל-Credentials API:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

יצירת אובייקט CredentialRequest

אובייקט CredentialRequest מציין את מערכות הכניסה שמהן רוצים לבקש פרטי כניסה. יצירת קוד CredentialRequest באמצעות השיטה setPasswordLoginSupported לכניסה מבוססת סיסמה, ובשיטה setAccountTypes() לשירותים של כניסה מאוחדת, כמו כניסה באמצעות Google.

mCredentialRequest = new CredentialRequest.Builder()
    .setPasswordLoginSupported(true)
    .setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
    .build();

משתמשים בקבועים שמוגדרים ב-IdentityProviders כדי לציין ספקי כניסה נפוצים. לספקי כניסה אחרים, כדאי להשתמש בכל מחרוזת שמזהה את הספק באופן ייחודי. חשוב להשתמש באותו מזהה ספק לאחסון פרטי הכניסה שבהם אתם משתמשים כדי לאחזר את פרטי הכניסה.

בקשה לפרטי כניסה שמורים

אחרי שיוצרים אובייקטים מסוג CredentialsClient ו-CredentialRequest, צריך להעביר את אובייקט הבקשה ל-method CredentialsClient.request() כדי לבקש פרטי כניסה שמאוחסנים באפליקציה.

  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"
              // ...
          }
      });

באמצעות השיטה addOnCompleteListener() צריך להגדיר קריאה חוזרת (callback) לטיפול בבקשות מוצלחות ובבקשות שנכשלו.

טיפול בבקשות פרטי כניסה שבוצעו בהצלחה

הודעה קופצת שמציינת כניסה מוצלחת בבקשה מוצלחת של פרטי כניסה, יש להשתמש באובייקט Credential שמתקבל כדי להשלים את הכניסה של המשתמש לאפליקציה. יש להשתמש בשיטה getAccountType() כדי לקבוע את הסוג של פרטי הכניסה שאוחזרו, ולאחר מכן להשלים את תהליך הכניסה המתאים. לדוגמה, עבור כניסה באמצעות חשבון Google, צריך ליצור אובייקט GoogleSignInClient שכולל את מזהה המשתמש, ואז להשתמש באובייקט כדי להתחיל את תהליך הכניסה. בכניסה באמצעות סיסמה, משתמשים במזהה ובסיסמה של המשתמש באובייקט 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();
        // ...
    }
}

טיפול בפרטי כניסה שמורים מרובים

בוחר החשבונות של Smart Lock

אם צריך להזין פרטי כניסה על ידי המשתמש, המשימה request() תיכשל עם ResolvableApiException. צריך לוודא שהפונקציה getStatusCode() מחזירה RESOLUTION_REQUIRED וקוראים ל-method של startResolutionForResult() של החריג כדי לבקש מהמשתמש לבחור חשבון. לאחר מכן, מאחזרים את פרטי הכניסה שהמשתמש בחר מ-method onActivityResult() של הפעילות, על ידי העברת Credential.EXTRA_KEY ל-method 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();
        }
    }

    // ...

}

אם לא נמצאים פרטי כניסה שמורים, המשתמשים צריכים ליצור חשבון או להיכנס ידנית. אם המתג getStatusCode() מחזיר SIGN_IN_REQUIRED, אפשר לזרז את תהליכי ההרשמה והכניסה באמצעות בקשה מהמשתמש לבחור פרטי כניסה שהשתמש בהם לאחרונה, כמו כתובת אימייל ושם, ולמלא באופן אוטומטי חלק מהשדות בטפסים. לפרטים נוספים קראו את המאמר איך מספקים למשתמשים טיפים לכניסה.

כשהכניסה לחשבון מצליחה, המשתמשים יכולים לשמור את פרטי הכניסה כדי שהאימות העתידי יהיה אוטומטי בכל המכשירים.