'Google से साइन इन करें' सुविधा लागू करना

इस गाइड में, 'Google से साइन इन करें' सुविधा को लागू करने का तरीका बताया गया है. इसमें ये चरण शामिल हैं:

  • अपने ऐप्लिकेशन में डिपेंडेंसी जोड़ें.
  • CredentialManager को इंस्टैंशिएट करें.
  • बॉटम शीट फ़्लो बनाएं.
  • बटन फ़्लो बनाएं.
  • साइन-इन के जवाब को मैनेज करता है.
  • गड़बड़ियां ठीक करना.
  • साइन-आउट करने की प्रोसेस मैनेज करना.

अपने ऐप्लिकेशन में डिपेंडेंसी जोड़ना

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

Kotlin

dependencies {
    implementation("androidx.credentials:credentials:1.6.0-rc02")
    implementation("androidx.credentials:credentials-play-services-auth:1.6.0-rc02")
    implementation("com.google.android.libraries.identity.googleid:googleid:<latest version>")
}

Groovy

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

क्रेडेंशियल मैनेजर को इंस्टैंशिएट करना

CredentialManager ऑब्जेक्ट बनाने के लिए, अपने ऐप्लिकेशन या गतिविधि के कॉन्टेक्स्ट का इस्तेमाल करें.

// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)

बॉटम शीट फ़्लो बनाना

बॉटम शीट, क्रेडेंशियल मैनेजर का इनबिल्ट यूज़र इंटरफ़ेस (यूआई) है. इस यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करने से, पुष्टि करने के सभी तरीकों में एक जैसा अनुभव मिलता है. जैसे, पासवर्ड, पासकी, और 'Google से साइन इन करें' सुविधा.

पहले से अनुमति पा चुके खातों के लिए, साइन-इन करने के अनुरोध को कॉन्फ़िगर करना

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

यहां दिए गए स्निपेट से यह पता चलता है कि खाता, अनुमति पा चुका है या नहीं.

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    .setFilterByAuthorizedAccounts(true)
    .setServerClientId(WEB_CLIENT_ID)
    .setAutoSelectEnabled(true)
    .setNonce(generateSecureRandomNonce())
    .build()

अनुरोध googleIdOption ऑब्जेक्ट को इस तरह कॉन्फ़िगर किया गया है:

  • पहले से अनुमति पा चुके खातों को फ़िल्टर करें: उन खातों को वापस पाने के लिए जिन्हें पहले से अनुमति मिली हुई है और जिनका इस्तेमाल आपके ऐप्लिकेशन में साइन इन करने के लिए किया गया था, setFilterByAuthorizedAccounts को true पर सेट करें.

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

  • सर्वर क्लाइंट आईडी सेट करें: setServerClientId पैरामीटर सेट करें. webClientId वह वेब क्लाइंट आईडी है जिसे आपने Google Cloud प्रोजेक्ट में OAuth के लिए सेट अप किया था. ऐसा ज़रूरी शर्तें पूरी करते समय किया गया था.

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

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

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

    नॉन्स जनरेट करने के लिए, इस तरह के फ़ंक्शन का इस्तेमाल करें. यह फ़ंक्शन, तय की गई लंबाई का क्रिप्टोग्राफ़िक तरीके से मज़बूत रैंडम नॉन्स जनरेट करता है और Base64 का इस्तेमाल करके उसे एन्कोड करता है:

fun generateSecureRandomNonce(byteLength: Int = 32): String {
    val randomBytes = ByteArray(byteLength)
    SecureRandom().nextBytes(randomBytes)
    return Base64.encodeToString(randomBytes, Base64.NO_WRAP or Base64.URL_SAFE or Base64.NO_PADDING)
}

साइन इन करने का अनुरोध करना

getCredential तरीके को कॉल करके, यह पता करें कि उपयोगकर्ता के पास डिवाइस पर कोई मान्य खाता है या नहीं:

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

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

अगर कोई भी मान्य खाता उपलब्ध नहीं है, तो साइन इन करने के अनुरोध को कॉन्फ़िगर करें

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

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

इसके बाद, उसी तरह साइन इन करने का अनुरोध करें जिस तरह आपने मंज़ूरी वाले खातों के लिए किया था.

बटन फ़्लो बनाना

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

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

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

इसे Jetpack Compose बटन की मदद से किया जा सकता है. हालांकि, 'Google से साइन इन करें' सुविधा के ब्रैंडिंग दिशा-निर्देश पेज पर जाकर, पहले से मंज़ूरी पा चुके ब्रैंड आइकॉन का इस्तेमाल किया जा सकता है.

साइन-इन फ़्लो बनाना

Google आईडी टोकन पाने के लिए, GetSignInWithGoogleOption की मदद से Google साइन-इन का अनुरोध करें.

val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder(
    serverClientId = WEB_CLIENT_ID
).setNonce(generateSecureRandomNonce())
    .build()

इसके बाद, साइन इन करने का अनुरोध करें. यह अनुरोध उसी तरह करें जिस तरह आपने बॉटम शीट यूज़र इंटरफ़ेस (यूआई) के लिए किया था.

बॉटम शीट और बटन के लिए, शेयर किए गए साइन इन फ़ंक्शन को बनाएं

साइन-इन की प्रोसेस को मैनेज करने के लिए, यह तरीका अपनाएं:

  1. CredentialManager के getCredential() फ़ंक्शन का इस्तेमाल करें. अगर जवाब सही है, तो CustomCredential निकालें. यह GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL टाइप का होना चाहिए.
  2. GoogleIdTokenCredential.createFrom() तरीके का इस्तेमाल करके, ऑब्जेक्ट को GoogleIdTokenCredential में बदलें.

  3. अपने रिलाइंग पार्टी सर्वर पर क्रेडेंशियल की पुष्टि करें.

  4. पक्का करें कि आपने गड़बड़ियों को सही तरीके से ठीक किया हो.

fun handleSign(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 the ID for server-side validation.
                    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 खाते हो सकते हैं और वह किसी दूसरे खाते से साइन इन करने का फ़ैसला कर सकता है. इसे, उदाहरण के लिए, सेटिंग पेज पर दिया जा सकता है.

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

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