'Google-এর মাধ্যমে সাইন-ইন করুন' ফিচার প্রয়োগ করা

এই নির্দেশিকায় 'Google-এর মাধ্যমে সাইন-ইন করুন' ফিচার কীভাবে প্রয়োগ করবেন তা বর্ণনা করা হয়েছে এবং নিম্নলিখিত ধাপগুলি কভার করা হয়েছে:

  • আপনার অ্যাপে ডিপেন্ডেন্সি যোগ করুন।
  • CredentialManager ইনস্ট্যান্টিয়েট করুন।
  • স্ক্রিনের নিচে অ্যাটাচ করা শিট ফ্লো তৈরি করুন।
  • বোতামের ফ্লো তৈরি করুন।
  • সাইন-ইন সংক্রান্ত উত্তর ম্যানেজ করুন।
  • সমস্যার সমাধান করুন।
  • সাইন-আউট ম্যানেজ করুন।

আপনার অ্যাপে ডিপেন্ডেন্সি যোগ করা

আপনার মডিউলের build.gradle ফাইলে, ক্রেডেনশিয়াল ম্যানেজার, Play Services Auth এবং googleid-এর লেটেস্ট ভার্সন ব্যবহার করে ডিপেন্ডেন্সি ঘোষণা করুন:

কোটলিন

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

গ্রোভি

dependencies {
    implementation "androidx.credentials:credentials:1.7.0-alpha03"
    implementation "androidx.credentials:credentials-play-services-auth:1.7.0-alpha03"
    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)

স্ক্রিনের নিচে অ্যাটাচ করা শিট ফ্লো তৈরি করুন

স্ক্রিনের নিচে অ্যাটাচ করা শিট হল Credential Manager-এর ইনবিল্ট UI। এই UI ব্যবহার করলে, পাসওয়ার্ড, পাসকী ও Google-এর মাধ্যমে সাইন-ইন করার মতো সব যাচাইকরণ পদ্ধতি জুড়ে একই ধরনের অভিজ্ঞতা পাওয়া যায়।

আগে অনুমোদিত অ্যাকাউন্টের জন্য সাইন-ইন করার অনুরোধ কনফিগার করুন

ব্যবহারকারীর Google ID টোকেন ফিরিয়ে আনতে GetGoogleIdOption-এর মাধ্যমে Google সাইন-ইন অনুরোধ করার চেষ্টা করুন।

নিম্নলিখিত স্নিপেট চেক করে যে অ্যাকাউন্টটি অনুমোদিত অ্যাকাউন্ট কিনা।

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

অনুরোধের googleIdOption অবজেক্ট এইভাবে কনফিগার করা হয়:

  • আগে অনুমোদিত অ্যাকাউন্ট ফিল্টার করুন: আপনার অ্যাপে সাইন-ইন করার জন্য আগে ব্যবহার করা হয়েছে এমন অনুমোদিত অ্যাকাউন্ট ফিরিয়ে আনতে, setFilterByAuthorizedAccounts-কে true-এ সেট করুন।

    মনে রাখবেন, setFilterByAuthorizedAccounts-এর ডিফল্ট ভ্যালু হল true, যার অর্থ হল, স্ক্রিনের নিচে অ্যাটাচ করা শিট UI-এর ডিফল্ট অ্যাকশন হল শুধুমাত্র আগে অনুমোদিত অ্যাকাউন্ট দেখানো।

  • সার্ভার ক্লায়েন্ট আইডি সেট করুন: 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()

// Use an activity-based context to avoid undefined system UI
// launching behavior.
val mutableContext = MutableContextWrapper(activityContext)
coroutineScope {
    try {
        val result = credentialManager.getCredential(
            request = request,            
            context = mutableContext // Use MutableContextWrapper to avoid memory leak during configuration changes
        )
        handleSignIn(result)
    } catch (e: GetCredentialException) {
        // Handle failures
    }
}

কোনও অনুমোদিত অ্যাকাউন্ট উপলভ্য না থাকলে সাইন-ইন করার অনুরোধ কনফিগার করুন

ডিভাইসে আপনার অ্যাপের জন্য কোনও অনুমোদিত ব্যবহারকারী না থাকলে, CredentialManager একটি NoCredentialException রিটার্ন করে। এই পরিস্থিতিতে, অনুমোদিত অ্যাকাউন্ট ফিল্টার বন্ধ করুন যাতে ব্যবহারকারী অন্য অ্যাকাউন্ট ব্যবহার করে সাইন-আপ করতে পারেন।

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

এরপর, অনুমোদিত অ্যাকাউন্টের জন্য যেভাবে করেছিলেন ঠিক সেইভাবে সাইন-ইন করার অনুরোধ করুন।

বোতাম ফ্লো তৈরি করুন

নিম্নলিখিত শর্তে ব্যবহারকারীরা যাতে 'Google-এর মাধ্যমে সাইন-ইন করুন' ফিচার ব্যবহার করতে পারেন, তার জন্য বোতাম ব্যবহার করুন:

  • ব্যবহারকারী ক্রেডেনশিয়াল ম্যানেজার স্ক্রিনের নিচে অ্যাটাচ করা শিট UI বাতিল করেছেন।
  • ডিভাইসে কোনও Google অ্যাকাউন্ট নেই।
  • ডিভাইসে আগে থেকে থাকা অ্যাকাউন্ট আবার যাচাই করতে হবে।

বোতাম UI তৈরি করুন

Jetpack Compose বোতামের মাধ্যমে এটি করা গেলেও, আপনি Google-এর মাধ্যমে সাইন-ইন করুন ব্র্যান্ডিং নির্দেশিকা পৃষ্ঠা থেকে আগে থেকে অনুমোদিত ব্র্যান্ড আইকন ব্যবহার করতে পারেন।

সাইন-ইন ফ্লো তৈরি করা

Google ID টোকেন ফিরিয়ে আনতে GetSignInWithGoogleOption-এর মাধ্যমে Google সাইন-ইন অনুরোধ তৈরি করুন।

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

এরপর, স্ক্রিনের নিচে অ্যাটাচ করা শিট UI-এর জন্য যেভাবে করেছিলেন, ঠিক সেভাবেই সাইন-ইন করার অনুরোধ করুন।

স্ক্রিনের নিচে অ্যাটাচ করা শিট ও বোতামের জন্য শেয়ার করা সাইন-ইন ফাংশন তৈরি করুন

সাইন-ইন ম্যানেজ করতে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:

  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 অ্যাকাউন্ট থাকতে পারে এবং তিনি অন্য কোনও অ্যাকাউন্ট থেকে সাইন-ইন করার সিদ্ধান্ত নিতে পারেন। আপনি এটি আপনার, যেমন, সেটিংস পৃষ্ঠায় দিতে পারেন।

ক্রেডেনশিয়াল প্রদানকারী একটি অ্যাক্টিভ ক্রেডেনশিয়াল সেশন স্টোর করতে পারে এবং ভবিষ্যতে সাইন-ইন করার অনুরোধের জন্য সাইন-ইন বিকল্প সীমিত করতে এটি ব্যবহার করতে পারে। যেমন, এটি অন্য যেকোনও উপলভ্য ক্রেডেনশিয়ালের তুলনায় অ্যাক্টিভ ক্রেডেনশিয়ালকে অগ্রাধিকার দিতে পারে।

কোনও ব্যবহারকারী আপনার অ্যাপ থেকে সাইন-আউট করলে, সব ক্রেডেনশিয়াল প্রোভাইডার থেকে বর্তমান ব্যবহারকারীর ক্রেডেনশিয়াল স্ট্যাটাস মুছে দিতে API clearCredentialState() মেথড কল করুন। এটি সব ক্রেডেনশিয়াল প্রদানকারীকে বিজ্ঞপ্তি পাঠাবে যে প্রদত্ত অ্যাপের জন্য স্টোর করা যেকোনও ক্রেডেনশিয়াল সেশন মুছে দিতে হবে, যাতে ব্যবহারকারীরা পরের বার সম্পূর্ণ সাইন-ইন বিকল্প পান।