Google দিয়ে সাইন ইন করুন বাস্তবায়ন করুন

এই নির্দেশিকায় ‘সাইন ইন উইথ গুগল’ কীভাবে প্রয়োগ করতে হয় তা বর্ণনা করা হয়েছে এবং এতে নিম্নলিখিত ধাপগুলো অন্তর্ভুক্ত রয়েছে:

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

আপনার অ্যাপে নির্ভরতা যোগ করুন

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

কোটলিন

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

গ্রোভি

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

বটম শীট ফ্লো তৈরি করুন

বটম শীটটি হলো ক্রেডেনশিয়াল ম্যানেজারের অন্তর্নির্মিত ইউজার ইন্টারফেস (UI)। এই UI ব্যবহার করে পাসওয়ার্ড, পাসকি এবং ‘সাইন ইন উইথ গুগল’-এর মতো সমস্ত প্রমাণীকরণ পদ্ধতিতে একটি সামঞ্জস্যপূর্ণ অভিজ্ঞতা তৈরি করা যায়।

পূর্বে অনুমোদিত অ্যাকাউন্টগুলির জন্য সাইন-ইন অনুরোধ কনফিগার করুন।

ব্যবহারকারীর গুগল আইডি টোকেন পুনরুদ্ধার করতে GetGoogleIdOption সহ একটি গুগল সাইন-ইন অনুরোধ করার চেষ্টা করুন।

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

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

অনুরোধের googleIdOption অবজেক্টটি নিম্নরূপে কনফিগার করা হয়েছে:

  • পূর্বে অনুমোদিত অ্যাকাউন্টগুলি ফিল্টার করুন: আপনার অ্যাপে পূর্বে সাইন ইন করতে ব্যবহৃত অনুমোদিত অ্যাকাউন্টগুলি পুনরুদ্ধার করতে, setFilterByAuthorizedAccounts true তে সেট করুন।

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

  • সার্ভার ক্লায়েন্ট আইডি সেট করুন: setServerClientId প্যারামিটারটি সেট করুন। webClientId হলো সেই ওয়েব ক্লায়েন্ট আইডি যা আপনি পূর্বশর্তগুলো সম্পন্ন করার সময় আপনার গুগল ক্লাউড প্রজেক্টে OAuth-এর জন্য সেট আপ করেছিলেন।

  • স্বয়ংক্রিয় সাইন-ইন সক্ষম করুন (ঐচ্ছিক): পুরনো ব্যবহারকারীদের জন্য স্বয়ংক্রিয় সাইন-ইন সক্ষম করতে, setAutoSelectEnabled(true) এবং setFilterByAuthorizedAccounts(true) ব্যবহার করুন। আপনার অ্যাপ ব্যবহারকারীরা যদি আগে থেকেই সাইন-ইন করে থাকেন, তবে এটি তাদের জন্য অপ্রয়োজনীয় জটিলতা দূর করে।

    নিম্নলিখিত শর্তগুলো পূরণ হলেই কেবল স্বয়ংক্রিয় সাইন-ইন সম্ভব:

    • ডিভাইসটিতে শুধুমাত্র একটি অনুমোদিত অ্যাকাউন্ট রয়েছে এবং সেই অনুমোদিত অ্যাকাউন্টটি পূর্বে ডিভাইসটির অ্যাপে সাইন ইন করতে ব্যবহৃত হয়েছিল। ডিভাইসটিতে একাধিক অনুমোদিত অ্যাকাউন্ট থাকলে স্বয়ংক্রিয় সাইন-ইন নিষ্ক্রিয় হয়ে যায়।
    • ব্যবহারকারী তার পূর্ববর্তী সেশনে অ্যাপটি থেকে স্পষ্টভাবে সাইন আউট করেননি।
    • ব্যবহারকারী তার গুগল অ্যাকাউন্ট সেটিংসে স্বয়ংক্রিয় সাইন-ইন নিষ্ক্রিয় করেননি।
  • ননস সেট করুন (ঐচ্ছিক): উন্নত নিরাপত্তা সক্রিয় করতে, সার্ভার-সাইড যাচাইকরণের জন্য একটি ননস সেট করুন। রিপ্লে অ্যাটাক প্রতিরোধ করতে, আপনি 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()

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

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

নিম্নলিখিত শর্তগুলোর জন্য ব্যবহারকারীরা যাতে গুগল দিয়ে সাইন ইন করতে পারে, তার জন্য একটি বাটন ব্যবহার করুন:

  • ব্যবহারকারী ক্রেডেনশিয়াল ম্যানেজার বটম শীট UI-টি বাতিল করেছেন।
  • ডিভাইসটিতে কোনো গুগল অ্যাকাউন্ট নেই।
  • ডিভাইসটিতে থাকা বিদ্যমান অ্যাকাউন্টগুলোর পুনঃপ্রমাণীকরণ প্রয়োজন।

বাটন UI তৈরি করুন

যদিও এটি একটি Jetpack Compose বাটন দিয়ে করা যায়, আপনি 'Sign in with Google Branding Guidelines' পৃষ্ঠা থেকে আগে থেকে অনুমোদিত একটি ব্র্যান্ড আইকন ব্যবহার করতে পারেন।

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

একটি গুগল আইডি টোকেন পেতে GetSignInWithGoogleOption ব্যবহার করে একটি গুগল সাইন-ইন অনুরোধ তৈরি করুন।

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")
        }
    }
}

ত্রুটিগুলি পরিচালনা করুন

আপনার কোড সম্ভাব্য সকল ত্রুটির পরিস্থিতি সামাল দিতে পারছে কিনা, তা নিশ্চিত করতে ট্রাবলশুটিং- এ তালিকাভুক্ত ত্রুটিগুলো পর্যালোচনা করুন।

সাইন-আউট পরিচালনা করুন

আপনার ব্যবহারকারীদের অ্যাপ থেকে সাইন আউট করার জন্য একটি ব্যবস্থা রাখা জরুরি। উদাহরণস্বরূপ, একজন ব্যবহারকারীর ডিভাইসে একাধিক গুগল অ্যাকাউন্ট থাকতে পারে এবং তিনি অন্য কোনো অ্যাকাউন্ট থেকে সাইন ইন করার সিদ্ধান্ত নিতে পারেন। আপনি এই সুবিধাটি আপনার, উদাহরণস্বরূপ, সেটিংস পৃষ্ঠায় রাখতে পারেন।

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

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