כניסה אוטומטית של משתמשים לאפליקציה באמצעות ה-API של פרטי הכניסה כדי לבקש גישה ולאחזר פרטי כניסה שמורים עבור המשתמשים.
לפני שמתחילים
מגדירים פרויקט ב-Android Studio.
יצירת אובייקט CredentialsClient
כדי לבקש פרטי כניסה שמורים, צריך ליצור מופע של
CredentialsClient
כדי לגשת ל-Credential 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
, מעבירים את אובייקט הבקשה
אל 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"
// ...
}
});
להגדיר קריאה חוזרת (callback) כדי לטפל בבקשות שהושלמו בהצלחה או שנכשלו באמצעות
אמצעי תשלום אחד (addOnCompleteListener()
).
טיפול בבקשות לפרטי כניסה שבוצעו בהצלחה
בבקשת פרטי כניסה מוצלחת, משתמשים
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()
של החריג כדי לבקש מהמשתמש
כדי לבחור חשבון. לאחר מכן, מאחזרים את פרטי הכניסה של המשתמש שנבחר
onActivityResult()
של הפעילות על ידי העברת Credential.EXTRA_KEY
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
,
אם תרצו לזרז את תהליכי ההרשמה והכניסה, תוכלו
כדי לבחור פרטי כניסה שנעשה בהם שימוש לאחרונה, כמו כתובת אימייל
ולמילוי אוטומטי של פרטים מסוימים בטפסים.
מידע נוסף זמין בקטע הצגת טיפים לכניסה למשתמש.
אפשר לקבל פרטים נוספים.
אחרי שנכנסים לחשבון בהצלחה, צריך לאפשר למשתמשים לשמור את פרטי הכניסה שלהם כדי להפוך את האימות העתידי לאוטומטי בכל המכשירים שלהם.