يمكنك تسجيل دخول المستخدمين تلقائيًا إلى تطبيقك باستخدام Credentials API لطلب بيانات الاعتماد المخزّنة للمستخدمين واستردادها.
قبل البدء
إنشاء كائن 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
، أدخِل كائن الطلب إلى الطريقة 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()
.
معالجة طلبات بيانات الاعتماد الناجحة
في حال نجاح طلب بيانات الاعتماد، استخدِم كائن
Credential
الناتج لإكمال عملية تسجيل دخول المستخدم إلى تطبيقك. استخدِم طريقة getAccountType()
لتحديد نوع بيانات الاعتماد التي تم استردادها، ثم أكمِل عملية
تسجيل الدخول المناسبة. على سبيل المثال، بالنسبة إلى ميزة "تسجيل الدخول بحساب Google"، يمكنك إنشاء عنصر GoogleSignInClient
يتضمّن رقم تعريف المستخدم، ثم استخدام الكائن لبدء عملية تسجيل الدخول. لتسجيل الدخول باستخدام كلمة مرور، يجب استخدام رقم تعريف المستخدم وكلمة مروره من عنصر "بيانات الاعتماد" لإكمال عملية تسجيل الدخول إلى التطبيق.
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
واستدعِ طريقة 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
، يمكنك اختياريًا تسريع عمليتَي الاشتراك وتسجيل الدخول من خلال مطالبة المستخدم باختيار معلومات تسجيل الدخول المستخدَمة مؤخرًا، مثل عنوان البريد الإلكتروني والاسم، وملء بعض حقول النماذج تلقائيًا بهذه المعلومات.
راجع تقديم تلميحات تسجيل الدخول للمستخدم
للحصول على التفاصيل.
عند تسجيل الدخول بنجاح، اسمح للمستخدمين بحفظ بيانات الاعتماد لبرمجة المصادقة المستقبلية على جميع أجهزتهم.