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

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

एक टैप में साइन-इन करने का यूज़र इंटरफ़ेस

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

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

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

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

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

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

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

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

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

अगर आपके ऐप्लिकेशन में पासवर्ड के आधार पर साइन इन किया जाता है, तो पासवर्ड क्रेडेंशियल के अनुरोध चालू करने के लिए 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 API की पुष्टि करने की स्थिति भी रीसेट हो जाए.

अगले चरण

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

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