استرداد بيانات اعتماد المستخدم المخزنة

يمكنك تسجيل دخول المستخدمين تلقائيًا إلى تطبيقك باستخدام Credentials API لطلب بيانات الاعتماد المخزّنة للمستخدمين واستردادها.

قبل البدء

ضبط مشروع "استوديو Android"

إنشاء كائن 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();
        // ...
    }
}

التعامل مع العديد من بيانات الاعتماد المحفوظة

أداة اختيار الحساب في Smart Lock

عندما يكون مطلوبًا من المستخدم اختيار بيانات اعتماد، سيتعذّر تنفيذ المهمة 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، يمكنك اختياريًا تسريع عمليتَي الاشتراك وتسجيل الدخول من خلال مطالبة المستخدم باختيار معلومات تسجيل الدخول المستخدَمة مؤخرًا، مثل عنوان البريد الإلكتروني والاسم، وملء بعض حقول النماذج تلقائيًا بهذه المعلومات. راجع تقديم تلميحات تسجيل الدخول للمستخدم للحصول على التفاصيل.

عند تسجيل الدخول بنجاح، اسمح للمستخدمين بحفظ بيانات الاعتماد لبرمجة المصادقة المستقبلية على جميع أجهزتهم.