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

उपयोगकर्ता से अनुमति मांगने के लिए, One Tap साइन-इन क्लाइंट का इस्तेमाल करें. इससे, उन क्रेडेंशियल को वापस पाया जा सकता है जिनका इस्तेमाल उन्होंने आपके ऐप्लिकेशन में साइन इन करने के लिए किया था. ये क्रेडेंशियल, Google खाता या उपयोगकर्ता नाम-पासवर्ड का वह कॉम्बिनेशन हो सकता है जिसे उन्होंने Chrome, Android ऑटोमैटिक भरने की सुविधा या पासवर्ड के लिए Smart Lock का इस्तेमाल करके, Google पर सेव किया था.

One Tap साइन-इन का यूज़र इंटरफ़ेस (यूआई)

क्रेडेंशियल वापस पाने के बाद, उनका इस्तेमाल करके उपयोगकर्ता को अपने ऐप्लिकेशन में आसानी से साइन इन कराया जा सकता है.

अगर उपयोगकर्ता ने कोई क्रेडेंशियल सेव नहीं किया है, तो कोई यूज़र इंटरफ़ेस (यूआई) नहीं दिखाया जाता. साथ ही, साइन आउट करने के बाद उपयोगकर्ता को सामान्य अनुभव दिया जा सकता है.

मुझे One Tap साइन-इन की सुविधा का इस्तेमाल कहां करना चाहिए?

अगर आपके ऐप्लिकेशन में उपयोगकर्ताओं के लिए साइन इन करना ज़रूरी है, तो साइन-इन स्क्रीन पर One Tap यूज़र इंटरफ़ेस (यूआई) दिखाएं. अगर आपके ऐप्लिकेशन में पहले से ही "Google से साइन इन करें" बटन मौजूद है, तब भी यह सुविधा मददगार हो सकती है: One Tap यूज़र इंटरफ़ेस को कॉन्फ़िगर करके, सिर्फ़ वही क्रेडेंशियल दिखाए जा सकते हैं जिनका इस्तेमाल उपयोगकर्ता ने पहले साइन इन करने के लिए किया था. इससे, उन उपयोगकर्ताओं को यह याद रखने में मदद मिलती है जिन्होंने हाल ही में साइन इन किया है कि उन्होंने पिछली बार कैसे साइन इन किया था. साथ ही, यह सुविधा उपयोगकर्ताओं को आपके ऐप्लिकेशन में गलती से नया खाता बनाने से भी रोकती है.

अगर आपके ऐप्लिकेशन के लिए साइन इन करना ज़रूरी नहीं है, तो किसी भी ऐसी स्क्रीन पर एक टैप से साइन इन करने की सुविधा का इस्तेमाल करें जिस पर साइन इन करने से बेहतर अनुभव मिलता हो. उदाहरण के लिए, अगर उपयोगकर्ता साइन आउट रहते हुए आपके ऐप्लिकेशन में कॉन्टेंट ब्राउज़ कर सकते हैं, लेकिन साइन इन करने के बाद ही टिप्पणियां पोस्ट कर सकते हैं या शॉपिंग कार्ट में आइटम जोड़ सकते हैं, तो यह एक टैप से साइन इन करने के लिए सही संदर्भ होगा.

ऊपर बताई गई वजहों से, साइन इन करने की ज़रूरत न पड़ने वाले ऐप्लिकेशन को भी अपनी साइन इन स्क्रीन पर One Tap साइन इन की सुविधा का इस्तेमाल करना चाहिए.

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

1. One Tap साइन-इन क्लाइंट को कॉन्फ़िगर करना

One Tap साइन-इन क्लाइंट को कॉन्फ़िगर करके, उपयोगकर्ताओं को सेव किए गए पासवर्ड, सेव किए गए Google खातों या दोनों में से किसी एक के ज़रिए साइन इन कराया जा सकता है. हमारा सुझाव है कि आप दोनों तरीकों का इस्तेमाल करें, ताकि नए उपयोगकर्ताओं के लिए एक टैप में खाता बनाने की सुविधा चालू की जा सके. साथ ही, जितने हो सके उतने पुराने उपयोगकर्ताओं के लिए, अपने-आप या एक टैप में साइन इन करने की सुविधा चालू की जा सके.

अगर आपका ऐप्लिकेशन, पासवर्ड के ज़रिए साइन इन करने की सुविधा देता है, तो पासवर्ड क्रेडेंशियल के अनुरोधों को चालू करने के लिए setPasswordRequestOptions() का इस्तेमाल करें.

अगर आपका ऐप्लिकेशन Google साइन-इन का इस्तेमाल करता है, तो Google आईडी टोकन के अनुरोधों को चालू और कॉन्फ़िगर करने के लिए, setGoogleIdTokenRequestOptions() का इस्तेमाल करें:

  • सर्वर क्लाइंट आईडी को Google APIs कंसोल में बनाए गए आईडी पर सेट करें. ध्यान दें कि यह आपके सर्वर का क्लाइंट आईडी है, न कि आपका Android क्लाइंट आईडी.

  • क्लाइंट को अनुमति वाले खातों के हिसाब से फ़िल्टर करने के लिए कॉन्फ़िगर करें. इस विकल्प को चालू करने पर, One Tap क्लाइंट सिर्फ़ उन Google खातों से आपके ऐप्लिकेशन में साइन इन करने के लिए उपयोगकर्ताओं को कहता है जिनका इस्तेमाल उन्होंने पहले किया है. ऐसा करने से, उपयोगकर्ताओं को साइन इन करने में मदद मिल सकती है. ऐसा तब होता है, जब उन्हें यह पता न हो कि उनके पास पहले से कोई खाता है या उन्होंने किस Google खाते का इस्तेमाल किया था. साथ ही, इससे उपयोगकर्ता आपके ऐप्लिकेशन से गलती से नया खाता बनाने से बच जाते हैं.

  • अगर आपको उपयोगकर्ताओं को अपने-आप साइन इन करने की सुविधा देनी है, तो setAutoSelectEnabled() की मदद से यह सुविधा चालू करें. अपने-आप साइन इन होने की सुविधा तब चालू की जा सकती है, जब ये शर्तें पूरी हों:

    • उपयोगकर्ता के पास आपके ऐप्लिकेशन के लिए, एक ही क्रेडेंशियल सेव है. जैसे, एक सेव किया गया पासवर्ड या एक सेव किया गया Google खाता.
    • उपयोगकर्ता ने अपनी Google खाता सेटिंग में, अपने-आप साइन इन होने की सुविधा बंद न की हो.
  • हालांकि, यह ज़रूरी नहीं है, लेकिन हमारा सुझाव है कि आप साइन इन की सुरक्षा को बेहतर बनाने और रीप्ले अटैक से बचने के लिए, नॉन्स का इस्तेमाल करें. हर अनुरोध में नॉन्स शामिल करने के लिए, setNonce का इस्तेमाल करें. नॉन्स जनरेट करने के सुझाव और ज़्यादा जानकारी के लिए, SafetyNet का नॉन्स पाएं सेक्शन देखें.

Java

public class YourActivity extends AppCompatActivity {
  // ...

  private SignInClient oneTapClient;
  private BeginSignInRequest signInRequest;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState,
                       @Nullable PersistableBundle persistentState) {
      super.onCreate(savedInstanceState, persistentState);

      oneTapClient = Identity.getSignInClient(this);
      signInRequest = BeginSignInRequest.builder()
              .setPasswordRequestOptions(PasswordRequestOptions.builder()
                      .setSupported(true)
                      .build())
              .setGoogleIdTokenRequestOptions(GoogleIdTokenRequestOptions.builder()
                      .setSupported(true)
                      // Your server's client ID, not your Android client ID.
                      .setServerClientId(getString(R.string.default_web_client_id))
                      // Only show accounts previously used to sign in.
                      .setFilterByAuthorizedAccounts(true)
                      .build())
              // Automatically sign in when exactly one credential is retrieved.
              .setAutoSelectEnabled(true)
              .build();
      // ...
  }
  // ...
}

Kotlin

class YourActivity : AppCompatActivity() {
    // ...

    private lateinit var oneTapClient: SignInClient
    private lateinit var signInRequest: BeginSignInRequest

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        oneTapClient = Identity.getSignInClient(this)
        signInRequest = BeginSignInRequest.builder()
            .setPasswordRequestOptions(BeginSignInRequest.PasswordRequestOptions.builder()
                .setSupported(true)
                .build())
            .setGoogleIdTokenRequestOptions(
                BeginSignInRequest.GoogleIdTokenRequestOptions.builder()
                    .setSupported(true)
                    // Your server's client ID, not your Android client ID.
                    .setServerClientId(getString(R.string.your_web_client_id))
                    // Only show accounts previously used to sign in.
                    .setFilterByAuthorizedAccounts(true)
                    .build())
            // Automatically sign in when exactly one credential is retrieved.
            .setAutoSelectEnabled(true)
            .build()
        // ...
    }
    // ...
}

2. साइन इन किए हुए उपयोगकर्ता की जांच करना

अगर आपकी गतिविधि का इस्तेमाल, साइन इन किए हुए उपयोगकर्ता या साइन आउट किए हुए उपयोगकर्ता, दोनों कर सकते हैं, तो एक टैप से साइन इन करने की सुविधा वाला यूज़र इंटरफ़ेस (यूआई) दिखाने से पहले, उपयोगकर्ता का स्टेटस देखें.

आपको यह भी ट्रैक करना चाहिए कि उपयोगकर्ता ने पहले ही, एक टैप से साइन इन करने की सुविधा का इस्तेमाल करने से मना कर दिया है या नहीं. ऐसा, प्रॉम्प्ट को बंद करके या उसके बाहर टैप करके किया जा सकता है. यह आपकी गतिविधि की बूलियन प्रॉपर्टी की तरह आसान हो सकता है. (यहां One Tap यूज़र इंटरफ़ेस दिखाना बंद करना देखें.)

3. One Tap साइन-इन का यूज़र इंटरफ़ेस (यूआई) दिखाना

अगर उपयोगकर्ता ने साइन इन नहीं किया है और उसने पहले से ही One Tap साइन-इन का इस्तेमाल करने से इनकार नहीं किया है, तो क्लाइंट ऑब्जेक्ट के beginSignIn() तरीके को कॉल करें और रिटर्न किए गए Task पर लिसनर अटैच करें. आम तौर पर, ऐप्लिकेशन ऐसा गतिविधि के onCreate() तरीके में करते हैं या एक गतिविधि वाले आर्किटेक्चर का इस्तेमाल करते समय, स्क्रीन ट्रांज़िशन के बाद करते हैं.

अगर उपयोगकर्ता के पास आपके ऐप्लिकेशन के लिए सेव किए गए क्रेडेंशियल हैं, तो One Tap क्लाइंट, 'सफलता के बारे में सुनने वाला' फ़ंक्शन कॉल करेगा. 'सफलता के बारे में सुनने वाले' फ़ंक्शन में, Task नतीजे से पेंडिंग इंटेंट पाएं और One Tap साइन-इन यूज़र इंटरफ़ेस (यूआई) शुरू करने के लिए, उसे startIntentSenderForResult() को पास करें.

अगर उपयोगकर्ता के पास सेव किए गए कोई क्रेडेंशियल नहीं हैं, तो One Tap क्लाइंट, 'कार्रवाई पूरी न होने पर सूचना देने वाला फ़ंक्शन' को कॉल करेगा. इस मामले में, कोई कार्रवाई ज़रूरी नहीं है: बस ऐप्लिकेशन को साइन इन किए बिना इस्तेमाल करने की सुविधा को दिखाना जारी रखा जा सकता है. हालांकि, अगर आपके ऐप्लिकेशन में एक टैप से साइन अप करने की सुविधा काम करती है, तो खाता बनाने का आसान अनुभव पाने के लिए, यहां जाकर वह फ़्लो शुरू करें. सिर्फ़ एक टैप से नए खाते बनाना लेख पढ़ें.

Java

oneTapClient.beginSignIn(signUpRequest)
        .addOnSuccessListener(this, new OnSuccessListener<BeginSignInResult>() {
            @Override
            public void onSuccess(BeginSignInResult result) {
                try {
                    startIntentSenderForResult(
                            result.getPendingIntent().getIntentSender(), REQ_ONE_TAP,
                            null, 0, 0, 0);
                } catch (IntentSender.SendIntentException e) {
                    Log.e(TAG, "Couldn't start One Tap UI: " + e.getLocalizedMessage());
                }
            }
        })
        .addOnFailureListener(this, new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                // No saved credentials found. Launch the One Tap sign-up flow, or
                // do nothing and continue presenting the signed-out UI.
                Log.d(TAG, e.getLocalizedMessage());
            }
        });

Kotlin

oneTapClient.beginSignIn(signInRequest)
    .addOnSuccessListener(this) { result ->
        try {
            startIntentSenderForResult(
                result.pendingIntent.intentSender, REQ_ONE_TAP,
                null, 0, 0, 0, null)
        } catch (e: IntentSender.SendIntentException) {
            Log.e(TAG, "Couldn't start One Tap UI: ${e.localizedMessage}")
        }
    }
    .addOnFailureListener(this) { e ->
        // No saved credentials found. Launch the One Tap sign-up flow, or
        // do nothing and continue presenting the signed-out UI.
        Log.d(TAG, e.localizedMessage)
    }

4. उपयोगकर्ता के जवाब को मैनेज करना

One Tap साइन-इन प्रॉम्प्ट के लिए उपयोगकर्ता का जवाब, आपके ऐप्लिकेशन को आपकी गतिविधि के onActivityResult() तरीके का इस्तेमाल करके भेजा जाएगा. अगर उपयोगकर्ता ने साइन इन करने का विकल्प चुना, तो नतीजा के तौर पर सेव किया गया क्रेडेंशियल दिखेगा. अगर उपयोगकर्ता ने One Tap यूज़र इंटरफ़ेस (यूआई) को बंद करके या उसके बाहर टैप करके, साइन इन करने से मना कर दिया, तो नतीजा कोड RESULT_CANCELED के साथ दिखेगा. आपके ऐप्लिकेशन को दोनों स्थितियों को मैनेज करना होगा.

वापस पाए गए क्रेडेंशियल से साइन इन करना

अगर उपयोगकर्ता ने आपके ऐप्लिकेशन के साथ क्रेडेंशियल शेयर करने का विकल्प चुना है, तो onActivityResult() से One Tap क्लाइंट के getSignInCredentialFromIntent() तरीके पर इंटेंट डेटा भेजकर, उन्हें वापस पाया जा सकता है. अगर उपयोगकर्ता ने आपके ऐप्लिकेशन के साथ Google खाते का क्रेडेंशियल शेयर किया है, तो क्रेडेंशियल में googleIdToken प्रॉपर्टी की वैल्यू शून्य नहीं होगी. अगर उपयोगकर्ता ने सेव किया गया पासवर्ड शेयर किया है, तो क्रेडेंशियल में password प्रॉपर्टी की वैल्यू शून्य नहीं होगी.

अपने ऐप्लिकेशन के बैकएंड से पुष्टि करने के लिए, क्रेडेंशियल का इस्तेमाल करें.

  • अगर उपयोगकर्ता नाम और पासवर्ड का जोड़ा वापस पा लिया गया है, तो साइन इन करने के लिए उनका इस्तेमाल उसी तरह करें जिस तरह उपयोगकर्ता ने मैन्युअल तरीके से किया था.
  • अगर Google खाते के क्रेडेंशियल वापस पा लिए गए हैं, तो अपने बैकएंड के साथ पुष्टि करने के लिए आईडी टोकन का इस्तेमाल करें. अगर आपने रिप्ले आक्रमणों से बचने के लिए, नॉन्स का इस्तेमाल करने का विकल्प चुना है, तो अपने बैकएंड सर्वर पर रिस्पॉन्स वैल्यू देखें. आईडी टोकन का इस्तेमाल करके, बैकएंड के साथ पुष्टि करना देखें.

Java

public class YourActivity extends AppCompatActivity {

  // ...
  private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
  private boolean showOneTapUI = true;
  // ...

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      switch (requestCode) {
          case REQ_ONE_TAP:
              try {
                  SignInCredential credential = oneTapClient.getSignInCredentialFromIntent(data);
                  String idToken = credential.getGoogleIdToken();
                  String username = credential.getId();
                  String password = credential.getPassword();
                  if (idToken !=  null) {
                      // Got an ID token from Google. Use it to authenticate
                      // with your backend.
                      Log.d(TAG, "Got ID token.");
                  } else if (password != null) {
                      // Got a saved username and password. Use them to authenticate
                      // with your backend.
                      Log.d(TAG, "Got password.");
                  }
              } catch (ApiException e) {
                  // ...
              }
              break;
      }
  }
}

Kotlin

class YourActivity : AppCompatActivity() {

    // ...
    private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
    private var showOneTapUI = true
    // ...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
             REQ_ONE_TAP -> {
                try {
                    val credential = oneTapClient.getSignInCredentialFromIntent(data)
                    val idToken = credential.googleIdToken
                    val username = credential.id
                    val password = credential.password
                    when {
                        idToken != null -> {
                            // Got an ID token from Google. Use it to authenticate
                            // with your backend.
                            Log.d(TAG, "Got ID token.")
                        }
                        password != null -> {
                            // Got a saved username and password. Use them to authenticate
                            // with your backend.
                            Log.d(TAG, "Got password.")
                        }
                        else -> {
                            // Shouldn't happen.
                            Log.d(TAG, "No ID token or password!")
                        }
                    }
                } catch (e: ApiException) {
                    // ...
                }
            }
        }
    }
    // ...
}

One Tap का यूज़र इंटरफ़ेस दिखाना बंद करना

अगर उपयोगकर्ता ने साइन इन करने से मना कर दिया, तो getSignInCredentialFromIntent() पर किए गए कॉल से ApiException को CommonStatusCodes.CANCELED स्टेटस कोड के साथ दिखाया जाएगा. ऐसा होने पर, आपको One Tap साइन-इन यूज़र इंटरफ़ेस (यूआई) को कुछ समय के लिए बंद कर देना चाहिए, ताकि बार-बार प्रॉम्प्ट भेजकर उपयोगकर्ताओं को परेशान न किया जाए. यहां दिए गए उदाहरण में, गतिविधि पर प्रॉपर्टी सेट करके ऐसा किया गया है. इस प्रॉपर्टी का इस्तेमाल यह तय करने के लिए किया जाता है कि उपयोगकर्ता को एक टैप से साइन इन करने की सुविधा देनी है या नहीं. हालांकि, SharedPreferences में कोई वैल्यू सेव की जा सकती है या किसी अन्य तरीके का इस्तेमाल किया जा सकता है.

One Tap साइन इन के प्रॉम्प्ट की दर को सीमित करना ज़रूरी है. अगर ऐसा नहीं किया जाता है और कोई उपयोगकर्ता लगातार कई अनुरोधों को रद्द करता है, तो One Tap क्लाइंट अगले 24 घंटों तक उपयोगकर्ता को अनुरोध नहीं करेगा.

Java

public class YourActivity extends AppCompatActivity {

  // ...
  private static final int REQ_ONE_TAP = 2;  // Can be any integer unique to the Activity.
  private boolean showOneTapUI = true;
  // ...

  @Override
  protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
      super.onActivityResult(requestCode, resultCode, data);

      switch (requestCode) {
          case REQ_ONE_TAP:
              try {
                  // ...
              } catch (ApiException e) {
                  switch (e.getStatusCode()) {
                      case CommonStatusCodes.CANCELED:
                          Log.d(TAG, "One-tap dialog was closed.");
                          // Don't re-prompt the user.
                          showOneTapUI = false;
                          break;
                      case CommonStatusCodes.NETWORK_ERROR:
                          Log.d(TAG, "One-tap encountered a network error.");
                          // Try again or just ignore.
                          break;
                      default:
                          Log.d(TAG, "Couldn't get credential from result."
                                  + e.getLocalizedMessage());
                          break;
                  }
              }
              break;
      }
  }
}

Kotlin

class YourActivity : AppCompatActivity() {

    // ...
    private val REQ_ONE_TAP = 2  // Can be any integer unique to the Activity
    private var showOneTapUI = true
    // ...

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        when (requestCode) {
            REQ_ONE_TAP -> {
                try {
                    // ...
                } catch (e: ApiException) {
                    when (e.statusCode) {
                        CommonStatusCodes.CANCELED -> {
                            Log.d(TAG, "One-tap dialog was closed.")
                            // Don't re-prompt the user.
                            showOneTapUI = false
                        }
                        CommonStatusCodes.NETWORK_ERROR -> {
                            Log.d(TAG, "One-tap encountered a network error.")
                            // Try again or just ignore.
                        }
                        else -> {
                            Log.d(TAG, "Couldn't get credential from result." +
                                " (${e.localizedMessage})")
                        }
                    }
                }
            }
        }
    }
    // ...
}

5. साइन आउट करने की सुविधा को मैनेज करना

जब कोई उपयोगकर्ता आपके ऐप्लिकेशन से साइन आउट करता है, तो One Tap क्लाइंट के signOut() तरीके को कॉल करें. signOut() को कॉल करने पर, अपने-आप साइन इन होने की सुविधा तब तक बंद रहती है, जब तक उपयोगकर्ता फिर से साइन इन नहीं करता.

अपने-आप साइन इन करने की सुविधा का इस्तेमाल न करने पर भी, यह चरण ज़रूरी है. इससे यह पक्का होता है कि जब उपयोगकर्ता आपके ऐप्लिकेशन से साइन आउट करते हैं, तो आपके इस्तेमाल किए गए किसी भी Play services API की पुष्टि करने की स्थिति भी रीसेट हो जाती है.

अगले चरण

अगर आपने Google क्रेडेंशियल पाने के लिए, One Tap क्लाइंट को कॉन्फ़िगर किया है, तो आपके ऐप्लिकेशन को अब Google आईडी टोकन मिल सकते हैं. ये टोकन, आपके उपयोगकर्ताओं के Google खातों की जानकारी देते हैं. जानें कि बैकएंड पर इन टोकन का इस्तेमाल कैसे किया जा सकता है.

अगर आपके ऐप्लिकेशन में Google Sign-in की सुविधा काम करती है, तो One Tap क्लाइंट का इस्तेमाल करके, अपने ऐप्लिकेशन में खाता बनाने के आसान फ़्लो जोड़े जा सकते हैं.