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

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

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