'एक टैप से साइन इन करें' क्लाइंट का इस्तेमाल करके, उपयोगकर्ता से अनुमति का अनुरोध करें. इससे, उपयोगकर्ता के उन क्रेडेंशियल में से किसी एक को वापस पाया जा सकता है जिनका इस्तेमाल उसने पहले आपके ऐप्लिकेशन में साइन इन करने के लिए किया था. ये क्रेडेंशियल, Google खाता या उपयोगकर्ता नाम-पासवर्ड का ऐसा कॉम्बिनेशन हो सकता है जिसे उपयोगकर्ता ने Chrome, Android में ऑटोमैटिक तरीके से जानकारी भरने की सुविधा या Smart Lock for Passwords का इस्तेमाल करके Google में सेव किया हो.
क्रेडेंशियल मिल जाने के बाद, इनका इस्तेमाल करके उपयोगकर्ता को आसानी से अपने ऐप्लिकेशन में साइन इन कराया जा सकता है.
अगर उपयोगकर्ता ने कोई क्रेडेंशियल सेव नहीं किया है, तो कोई यूज़र इंटरफ़ेस (यूआई) नहीं दिखाया जाता. ऐसे में, साइन आउट किए गए उपयोगकर्ता को सामान्य अनुभव दिया जा सकता है.
मुझे One Tap साइन-इन की सुविधा कहां इस्तेमाल करनी चाहिए?
अगर आपके ऐप्लिकेशन में लोगों के लिए साइन इन करना ज़रूरी है, तो साइन-इन स्क्रीन पर One Tap यूज़र इंटरफ़ेस (यूआई) दिखाएं. अगर आपके पास पहले से ही "Google से साइन इन करें" बटन है, तो भी यह सुविधा आपके लिए फ़ायदेमंद हो सकती है. ऐसा इसलिए, क्योंकि One Tap यूज़र इंटरफ़ेस (यूआई) को सिर्फ़ उन क्रेडेंशियल को दिखाने के लिए कॉन्फ़िगर किया जा सकता है जिनका इस्तेमाल उपयोगकर्ता ने पहले साइन-इन करने के लिए किया था. इससे उन उपयोगकर्ताओं को यह याद दिलाने में मदद मिल सकती है जो कभी-कभी साइन इन करते हैं कि उन्होंने पिछली बार कैसे साइन इन किया था. साथ ही, उन्हें आपके ऐप्लिकेशन में गलती से नए खाते बनाने से रोका जा सकता है.
अगर आपके ऐप्लिकेशन में साइन इन करना ज़रूरी नहीं है, तो किसी भी ऐसी स्क्रीन पर 'एक टैप करके साइन इन करें' सुविधा का इस्तेमाल करें जहां साइन इन करने से उपयोगकर्ता अनुभव बेहतर होता है. उदाहरण के लिए, अगर उपयोगकर्ता साइन आउट किए बिना आपके ऐप्लिकेशन पर कॉन्टेंट ब्राउज़ कर सकते हैं, लेकिन सिर्फ़ साइन इन करने के बाद ही टिप्पणियां पोस्ट कर सकते हैं या शॉपिंग कार्ट में आइटम जोड़ सकते हैं, तो यह 'एक टैप करके साइन इन करें' सुविधा के लिए सही कॉन्टेक्स्ट होगा.
जिन ऐप्लिकेशन में साइन-इन करना ज़रूरी नहीं है उन्हें भी साइन-इन स्क्रीन पर One Tap साइन-इन का इस्तेमाल करना चाहिए. इसकी वजहें ऊपर बताई गई हैं.
शुरू करने से पहले
- एक टैप से साइन इन करने की सुविधा का इस्तेमाल शुरू करना लेख में दिए गए निर्देशों के मुताबिक, Google API कंसोल प्रोजेक्ट और Android प्रोजेक्ट सेट अप करें.
- अगर आपके ऐप्लिकेशन में पासवर्ड से साइन इन करने की सुविधा उपलब्ध है, तो अपने ऐप्लिकेशन को अपने-आप भरने की सुविधा के लिए ऑप्टिमाइज़ करें. इसके अलावा, 'पासवर्ड के लिए Smart Lock' का इस्तेमाल करें, ताकि उपयोगकर्ता साइन इन करने के बाद अपने पासवर्ड क्रेडेंशियल सेव कर सकें.
1. One Tap साइन-इन क्लाइंट को कॉन्फ़िगर करना
उपयोगकर्ताओं को सेव किए गए पासवर्ड, सेव किए गए Google खातों या दोनों में से किसी एक का इस्तेमाल करके साइन इन करने की अनुमति देने के लिए, One Tap साइन-इन क्लाइंट को कॉन्फ़िगर किया जा सकता है. (हमारा सुझाव है कि दोनों को चालू करें, ताकि नए उपयोगकर्ताओं के लिए एक टैप में खाता बनाने की सुविधा चालू हो सके. साथ ही, वापस आने वाले ज़्यादा से ज़्यादा उपयोगकर्ताओं के लिए, अपने-आप साइन इन होने या एक टैप में साइन इन होने की सुविधा चालू हो सके.)
अगर आपका ऐप्लिकेशन पासवर्ड के ज़रिए साइन-इन करने की सुविधा देता है, तो पासवर्ड क्रेडेंशियल के अनुरोधों को चालू करने के लिए setPasswordRequestOptions() का इस्तेमाल करें.
अगर आपका ऐप्लिकेशन Google साइन-इन का इस्तेमाल करता है, तो Google आईडी टोकन के अनुरोधों को चालू और कॉन्फ़िगर करने के लिए, setGoogleIdTokenRequestOptions() का इस्तेमाल करें:
सर्वर क्लाइंट आईडी को Google APIs console में बनाए गए आईडी पर सेट करें. ध्यान दें कि यह आपके सर्वर का क्लाइंट आईडी है, न कि आपके Android ऐप्लिकेशन का क्लाइंट आईडी.
क्लाइंट को कॉन्फ़िगर करें, ताकि वह मंज़ूरी वाले खातों के हिसाब से फ़िल्टर कर सके. इस विकल्प को चालू करने पर, One Tap क्लाइंट सिर्फ़ उन Google खातों से आपके ऐप्लिकेशन में साइन इन करने के लिए कहेगा जिनका इस्तेमाल लोगों ने पहले किया है. ऐसा करने से, उन उपयोगकर्ताओं को आसानी से साइन इन करने में मदद मिलती है जिन्हें यह नहीं पता कि उनके पास पहले से कोई खाता है या उन्होंने किस Google खाते का इस्तेमाल किया था. साथ ही, इससे उपयोगकर्ताओं को आपके ऐप्लिकेशन में गलती से नए खाते बनाने से रोका जा सकता है.
अगर आपको उपयोगकर्ताओं को अपने-आप साइन इन होने की सुविधा देनी है, तो
setAutoSelectEnabled()की मदद से इस सुविधा को चालू करें. इन शर्तों को पूरा करने पर, अपने-आप साइन इन करने की सुविधा काम करती है:- उपयोगकर्ता ने आपके ऐप्लिकेशन के लिए सिर्फ़ एक क्रेडेंशियल सेव किया है. इसका मतलब है कि उसने एक पासवर्ड या एक Google खाता सेव किया है.
- उपयोगकर्ता ने Google खाते की सेटिंग में, अपने-आप साइन-इन होने की सुविधा बंद न की हो.
हालांकि, इसका इस्तेमाल करना ज़रूरी नहीं है, लेकिन हमारा सुझाव है कि आप साइन-इन की सुरक्षा को बेहतर बनाने और रीप्ले अटैक से बचने के लिए, नॉनस का इस्तेमाल करें. हर अनुरोध में एक नॉनस शामिल करने के लिए, setNonce का इस्तेमाल करें. नॉनस जनरेट करने के बारे में सुझाव और ज़्यादा जानकारी के लिए, SafetyNet के Obtain a nonce सेक्शन देखें.
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() तरीके को कॉल करें. साथ ही, beginSignIn() से मिले ऑब्जेक्ट में लिसनर अटैच करें.Task आम तौर पर, ऐप्लिकेशन ऐसा Activity के onCreate() तरीके में करते हैं. इसके अलावा, सिंगल-ऐक्टिविटी आर्किटेक्चर का इस्तेमाल करते समय, स्क्रीन ट्रांज़िशन के बाद भी ऐसा किया जाता है.
अगर उपयोगकर्ता ने आपके ऐप्लिकेशन के लिए कोई क्रेडेंशियल सेव किया है, तो One Tap क्लाइंट, सफलता से जुड़ा लिसनर कॉल करेगा. सफलता से जुड़े लिसनर में, Task के नतीजे से लंबित इंटेंट पाएं और उसे 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. उपयोगकर्ता के जवाब को मैनेज करना
उपयोगकर्ता ने एक टैप करके साइन इन करने के अनुरोध का क्या जवाब दिया, इसकी जानकारी आपके ऐप्लिकेशन को दी जाएगी. इसके लिए, आपकी गतिविधि के onActivityResult() तरीके का इस्तेमाल किया जाएगा. अगर उपयोगकर्ता ने साइन इन करने का विकल्प चुना है, तो नतीजे के तौर पर सेव किया गया क्रेडेंशियल दिखेगा. अगर उपयोगकर्ता ने 'एक टैप करके साइन इन करें' सुविधा वाले यूज़र इंटरफ़ेस (यूआई) को बंद करके या उसके बाहर टैप करके साइन इन करने से मना कर दिया है, तो नतीजे में 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() को कॉल करने पर, CommonStatusCodes.CANCELED स्टेटस कोड के साथ ApiException दिखेगा.
ऐसा होने पर, आपको कुछ समय के लिए 'एक टैप करके साइन इन करें' सुविधा का यूज़र इंटरफ़ेस (यूआई) बंद कर देना चाहिए, ताकि उपयोगकर्ताओं को बार-बार प्रॉम्प्ट न दिखें. यहां दिए गए उदाहरण में, इस काम को पूरा करने के लिए गतिविधि पर एक प्रॉपर्टी सेट की गई है. इसका इस्तेमाल यह तय करने के लिए किया जाता है कि उपयोगकर्ता को 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 क्लाइंट का इस्तेमाल करके, अपने ऐप्लिकेशन में बिना किसी रुकावट के खाता बनाने की सुविधा जोड़ी जा सकती है.