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