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

आपके ऐप्लिकेशन में साइन इन करने के लिए इस्तेमाल किए गए क्रेडेंशियल में से किसी एक को फिर से पाने के लिए, One Tap साइन-इन क्लाइंट का इस्तेमाल करें.

एक टैप में साइन इन करने का यूज़र इंटरफ़ेस (यूआई)

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

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

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

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

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

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

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

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

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

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

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

  • सर्वर क्लाइंट आईडी को उस आईडी पर सेट करें जिसे आपने Google API कंसोल में बनाया है. ध्यान दें कि यह आपके सर्वर का क्लाइंट आईडी है, न कि आपके 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 साइन-इन यूज़र इंटरफ़ेस (यूआई) दिखाने से पहले उपयोगकर्ता की स्थिति देखें.

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

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

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

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

अगर उपयोगकर्ता के पास सेव किया गया कोई क्रेडेंशियल नहीं है, तो One Tap क्लाइंट गड़बड़ी की जानकारी देने वाले को कॉल करेगा. इस स्थिति में, किसी कार्रवाई की ज़रूरत नहीं है: आप बस ऐप्लिकेशन से साइन आउट करने का अनुभव दिखाना जारी रख सकते हैं. हालांकि, अगर आपके पास 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 साइन-इन यूज़र इंटरफ़ेस (यूआई) को कुछ समय के लिए बंद कर देना चाहिए, ताकि आप अपने उपयोगकर्ताओं को बार-बार प्रॉम्प्ट दिखाकर परेशान न करें. इस उदाहरण में, ऐक्टिविटी पर एक प्रॉपर्टी सेट करके ऐसा किया गया है. प्रॉपर्टी का इस्तेमाल करके यह तय किया जाता है कि उपयोगकर्ता को 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 के किसी भी एपीआई की पुष्टि करने की स्थिति भी रीसेट हो जाए.

अगले चरण

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

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