'Google से साइन इन करें' सुविधा की मदद से उपयोगकर्ताओं की पुष्टि करना

Google से साइन इन करें सुविधा की मदद से, उपयोगकर्ता की पुष्टि करने की सुविधा को अपने Android ऐप्लिकेशन के साथ तुरंत इंटिग्रेट किया जा सकता है. उपयोगकर्ता अपने Google खाते का इस्तेमाल करके, आपके ऐप्लिकेशन में साइन इन कर सकते हैं, सहमति दे सकते हैं, और अपनी प्रोफ़ाइल की जानकारी को आपके ऐप्लिकेशन के साथ सुरक्षित तरीके से शेयर कर सकते हैं. Android की क्रेडेंशियल मैनेजर Jetpack लाइब्रेरी की मदद से, इस इंटिग्रेशन को आसानी से किया जा सकता है. साथ ही, एक ही एपीआई का इस्तेमाल करके, Android डिवाइसों पर एक जैसा अनुभव दिया जा सकता है.

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

'Google से साइन इन करें' सुविधा को सेट अप करने के लिए, ये दो मुख्य चरण अपनाएं:

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

क्रेडेंशियल मैनेजर की बॉटम शीट
पहला डायग्राम. Credential Manager की बॉटमशीट क्रेडेंशियल चुनने का यूज़र इंटरफ़ेस (यूआई)

अपने ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में, 'Google से साइन इन करें' बटन जोड़ें. 'Google से साइन इन करें' बटन की मदद से, उपयोगकर्ता अपने मौजूदा Google खातों का इस्तेमाल करके, Android ऐप्लिकेशन में साइन अप या साइन इन कर सकते हैं. अगर उपयोगकर्ता नीचे मौजूद शीट के यूज़र इंटरफ़ेस (यूआई) को खारिज करते हैं या साइन अप और साइन इन करने के लिए साफ़ तौर पर अपने Google खाते का इस्तेमाल करना चाहते हैं, तो वे 'Google से साइन इन करें' बटन पर क्लिक करेंगे. डेवलपर के लिए इसका मतलब है कि उपयोगकर्ताओं को आसानी से ऑनबोर्ड किया जा सकता है और साइन अप के दौरान आने वाली समस्याओं को कम किया जा सकता है.

'Google से साइन इन करें' फ़्लो दिखाने वाला ऐनिमेशन
दूसरी इमेज. Credential Manager में 'Google से साइन इन करें' बटन का यूज़र इंटरफ़ेस

इस दस्तावेज़ में, Google आईडी हेल्पर लाइब्रेरी का इस्तेमाल करके, 'Google से साइन इन करें' बटन और सबसे नीचे मौजूद डायलॉग बॉक्स को Credential Manager API के साथ इंटिग्रेट करने का तरीका बताया गया है.

Google API कंसोल प्रोजेक्ट सेट अप करना

  1. API Console में अपना प्रोजेक्ट खोलें या अगर आपके पास पहले से कोई प्रोजेक्ट नहीं है, तो एक प्रोजेक्ट बनाएं.
  2. OAuth की सहमति वाली स्क्रीन वाले पेज पर, पक्का करें कि पूरी जानकारी दी गई हो और वह सही हो.
    1. पक्का करें कि आपके ऐप्लिकेशन के लिए, ऐप्लिकेशन का नाम, ऐप्लिकेशन का लोगो, और ऐप्लिकेशन का होम पेज सही हो. ये वैल्यू, साइन अप करने के दौरान 'Google से साइन इन करें' की सहमति वाली स्क्रीन और तीसरे पक्ष के ऐप्लिकेशन और सेवाओं की स्क्रीन पर उपयोगकर्ताओं को दिखाई जाएंगी.
    2. पक्का करें कि आपने अपने ऐप्लिकेशन की निजता नीति और सेवा की शर्तों के यूआरएल डाले हों.
  3. अगर आपके पास पहले से कोई Android क्लाइंट आईडी नहीं है, तो क्रेडेंशियल पेज पर जाकर, अपने ऐप्लिकेशन के लिए एक Android क्लाइंट आईडी बनाएं. आपको अपने ऐप्लिकेशन के पैकेज का नाम और SHA-1 हस्ताक्षर डालना होगा.
    1. क्रेडेंशियल पेज पर जाएं.
    2. क्रेडेंशियल बनाएं > OAuth क्लाइंट आईडी पर क्लिक करें.
    3. Android ऐप्लिकेशन का टाइप चुनें.
  4. अगर आपने पहले से कोई "वेब ऐप्लिकेशन" क्लाइंट आईडी नहीं बनाया है, तो क्रेडेंशियल पेज पर जाकर नया क्लाइंट आईडी बनाएं. फ़िलहाल, "अनुमति वाले JavaScript ऑरिजिन" और "अनुमति वाले रीडायरेक्ट यूआरआई" फ़ील्ड को अनदेखा किया जा सकता है. इस क्लाइंट आईडी का इस्तेमाल, आपके बैकएंड सर्वर की पहचान करने के लिए किया जाएगा. ऐसा तब किया जाएगा, जब वह Google की पुष्टि करने वाली सेवाओं से संपर्क करेगा.
    1. क्रेडेंशियल पेज पर जाएं.
    2. क्रेडेंशियल बनाएं > OAuth क्लाइंट आईडी पर क्लिक करें.
    3. वेब ऐप्लिकेशन का टाइप चुनें.

डिपेंडेंसी का एलान करना

अपने मॉड्यूल की build.gradle फ़ाइल में, Credential Manager के सबसे नए वर्शन का इस्तेमाल करके डिपेंडेंसी का एलान करें:

dependencies {
  // ... other dependencies

  implementation "androidx.credentials:credentials:<latest version>"
  implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
  implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}

Google साइन इन के अनुरोध को तुरंत लागू करना

लागू करने की प्रोसेस शुरू करने के लिए, Google साइन-इन अनुरोध को इंस्टैंशिएट करें. किसी उपयोगकर्ता का Google आईडी टोकन पाने के लिए, GetGoogleIdOption का इस्तेमाल करें.

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

सबसे पहले, देखें कि उपयोगकर्ता के पास कोई ऐसा खाता है या नहीं जिसका इस्तेमाल पहले आपके ऐप्लिकेशन में साइन इन करने के लिए किया गया था. इसके लिए, setFilterByAuthorizedAccounts पैरामीटर को true पर सेट करके एपीआई को कॉल करें. साइन इन करने के लिए, उपयोगकर्ता उपलब्ध खातों में से किसी एक को चुन सकते हैं.

अगर अनुमति वाले कोई Google खाता उपलब्ध नहीं है, तो उपयोगकर्ता को अपने किसी भी उपलब्ध खाते से साइन अप करने के लिए कहा जाना चाहिए. ऐसा करने के लिए, एपीआई को फिर से कॉल करके उपयोगकर्ता से अनुरोध करें और setFilterByAuthorizedAccounts को false पर सेट करें. साइन अप करने के बारे में ज़्यादा जानें.

वापस आने वाले उपयोगकर्ताओं के लिए, अपने-आप साइन इन होने की सुविधा चालू करना (सुझाया गया)

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

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

  • अनुरोध से मेल खाने वाला एक क्रेडेंशियल मौजूद है. यह Google खाता या पासवर्ड हो सकता है. साथ ही, यह क्रेडेंशियल, Android डिवाइस पर डिफ़ॉल्ट तौर पर सेट किए गए खाते से मेल खाता है.
  • उपयोगकर्ता ने साफ़ तौर पर साइन आउट नहीं किया है.
  • उपयोगकर्ता ने अपने Google खाते की सेटिंग में, अपने-आप साइन इन होने की सुविधा बंद नहीं की है.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

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

सुरक्षा को बेहतर बनाने के लिए, नॉन्स सेट करना

साइन इन की सुरक्षा को बेहतर बनाने और रीप्ले अटैक से बचने के लिए, हर अनुरोध में एक नॉन्स शामिल करने के लिए, setNonce जोड़ें. नॉन्स जनरेट करने के बारे में ज़्यादा जानें.

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

'Google से साइन इन करें' फ़्लो बनाना

'Google से साइन इन करें' फ़्लो को सेट अप करने का तरीका यहां बताया गया है:

  1. GetCredentialRequest को इंस्टैंशिएट करें. इसके बाद, क्रेडेंशियल वापस पाने के लिए, addCredentialOption() का इस्तेमाल करके, पहले से बनाए गए googleIdOption को जोड़ें.
  2. उपयोगकर्ता के उपलब्ध क्रेडेंशियल पाने के लिए, इस अनुरोध को getCredential() (Kotlin) या getCredentialAsync() (Java) कॉल पर भेजें.
  3. एपीआई के काम करने के बाद, CustomCredential को निकालें. इसमें GoogleIdTokenCredential डेटा का नतीजा होता है.
  4. CustomCredential का टाइप, GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL की वैल्यू के बराबर होना चाहिए. GoogleIdTokenCredential.createFrom तरीके का इस्तेमाल करके, ऑब्जेक्ट को GoogleIdTokenCredential में बदलें.
  5. अगर कन्वर्ज़न पूरा हो जाता है, तो GoogleIdTokenCredential आईडी निकालें, उसकी पुष्टि करें, और अपने सर्वर पर क्रेडेंशियल की पुष्टि करें.

  6. अगर GoogleIdTokenParsingException की वजह से कन्वर्ज़न पूरा नहीं हो पाता है, तो हो सकता है कि आपको 'Google से साइन इन करें' लाइब्रेरी का वर्शन अपडेट करना पड़े.

  7. ऐसे कस्टम क्रेडेंशियल का पता लगाना जो स्वीकार नहीं किए जाते.

val request: GetCredentialRequest = Builder()
  .addCredentialOption(googleIdOption)
  .build()

coroutineScope.launch {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    handleFailure(e)
  }
}

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {

    // Passkey credential
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse on your server to
      // validate and authenticate
      responseJson = credential.authenticationResponseJson
    }

    // Password credential
    is PasswordCredential -> {
      // Send ID and password to your server to validate and authenticate.
      val username = credential.id
      val password = credential.password
    }

    // GoogleIdToken credential
    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract the ID to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
          // You can use the members of googleIdTokenCredential directly for UX
          // purposes, but don't use them to store or control access to user
          // data. For that you first need to validate the token:
          // pass googleIdTokenCredential.getIdToken() to the backend server.
          GoogleIdTokenVerifier verifier = ... // see validation instructions
          GoogleIdToken idToken = verifier.verify(idTokenString);
          // To get a stable account identifier (e.g. for storing user data),
          // use the subject ID:
          idToken.getPayload().getSubject()
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      } else {
        // Catch any unrecognized custom credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

'Google से साइन इन करें' बटन का फ़्लो ट्रिगर करना

'Google से साइन इन करें' बटन के फ़्लो को ट्रिगर करने के लिए, GetGoogleIdOption के बजाय GetSignInWithGoogleOption का इस्तेमाल करें:

val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder()
  .setServerClientId(WEB_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

नीचे दिए गए कोड के उदाहरण में बताए गए तरीके से, दिखाए गए GoogleIdTokenCredential को मैनेज करें.

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {
    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      }
      else -> {
        // Catch any unrecognized credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Google साइन इन अनुरोध को इंस्टैंशिएट करने के बाद, पुष्टि करने का फ़्लो उसी तरह से शुरू करें जिस तरह से Google से साइन इन करें सेक्शन में बताया गया है.

नए उपयोगकर्ताओं के लिए साइन-अप की सुविधा चालू करना (सुझाया गया)

'Google से साइन इन करें' सुविधा की मदद से, उपयोगकर्ता आपके ऐप्लिकेशन या सेवा में कुछ ही टैप में नया खाता बना सकते हैं.

अगर सेव किए गए कोई क्रेडेंशियल नहीं मिलते हैं (getGoogleIdOption से कोई Google खाता नहीं मिलता है), तो अपने उपयोगकर्ता को साइन अप करने के लिए कहें. सबसे पहले, यह देखें कि setFilterByAuthorizedAccounts(true) में, पहले इस्तेमाल किए गए खाते मौजूद हैं या नहीं. अगर कोई खाता नहीं मिलता है, तो setFilterByAuthorizedAccounts(false) का इस्तेमाल करके, उपयोगकर्ता को अपने Google खाते से साइन अप करने के लिए कहें

उदाहरण:

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(WEB_CLIENT_ID)
  .build()

Google साइन अप अनुरोध को इंस्टैंशिएट करने के बाद, पुष्टि करने का फ़्लो लॉन्च करें. अगर उपयोगकर्ता साइन अप के लिए, 'Google से साइन इन करें' सुविधा का इस्तेमाल नहीं करना चाहते, तो अपने ऐप्लिकेशन को ऑटोमैटिक भरने की सुविधा के लिए ऑप्टिमाइज़ करें. जब आपका उपयोगकर्ता खाता बना ले, तो खाता बनाने के आखिरी चरण के तौर पर, उसे पासकी में रजिस्टर करें.

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

जब कोई उपयोगकर्ता आपके ऐप्लिकेशन से साइन आउट करता है, तो क्रेडेंशियल की सेवा देने वाली सभी कंपनियों से, उपयोगकर्ता के मौजूदा क्रेडेंशियल की स्थिति को हटाने के लिए, एपीआई clearCredentialState() का तरीका इस्तेमाल करें. इससे, क्रेडेंशियल उपलब्ध कराने वाली सभी सेवाओं को सूचना मिलेगी कि दिए गए ऐप्लिकेशन के लिए सेव किया गया कोई भी क्रेडेंशियल सेशन मिटा दिया जाए.

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