किसी उपयोगकर्ता के सेव किए गए क्रेडेंशियल वापस पाएं

क्रेडेंशियल एपीआई का इस्तेमाल करके, उपयोगकर्ताओं को आपके ऐप्लिकेशन में अपने-आप साइन इन होने की सुविधा दें. इससे वे ऐप्लिकेशन इस्तेमाल करने वाले लोगों के लिए, सेव किए गए क्रेडेंशियल पा सकेंगे और उनका अनुरोध कर सकेंगे.

शुरू करने से पहले

Android Studio प्रोजेक्ट को कॉन्फ़िगर करना.

क्रेडेंशियल क्लाइंट ऑब्जेक्ट बनाएं

सेव किए गए क्रेडेंशियल का अनुरोध करने के लिए, आपको CredentialsClient का एक इंस्टेंस बनाना होगा, ताकि क्रेडेंशियल एपीआई को ऐक्सेस किया जा सके:

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

CredentialRequest ऑब्जेक्ट बनाएं

CredentialRequest ऑब्जेक्ट ऐसे साइन-इन सिस्टम के बारे में बताता है जिनसे आपको क्रेडेंशियल का अनुरोध करना है. पासवर्ड से साइन इन करने के लिए, setPasswordLoginSupported तरीके का इस्तेमाल करके CredentialRequest बनाएं. साथ ही, 'Google साइन-इन' जैसी फ़ेडरेटेड साइन-इन सेवाओं के लिए setAccountTypes() तरीका इस्तेमाल करें.

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, तो आपके पास साइन-अप और साइन-इन की प्रोसेस को तेज़ी से पूरा करने का विकल्प होता है. इसके लिए, उपयोगकर्ता से कहें कि वह हाल ही में इस्तेमाल की गई साइन इन जानकारी, जैसे कि ईमेल पता और नाम चुनें. साथ ही, फ़ॉर्म के कुछ फ़ील्ड में यह जानकारी अपने-आप भरें. ज़्यादा जानकारी के लिए, उपयोगकर्ता को साइन-इन करने से जुड़े संकेत दें देखें.

साइन इन कर लेने पर, उपयोगकर्ताओं को अपने क्रेडेंशियल सेव करने की अनुमति दें, ताकि आने वाले समय में उनके सभी डिवाइसों पर पुष्टि करने की प्रक्रिया को ऑटोमेट किया जा सके.