একটি পাসকি দিয়ে সাইন ইন করুন

এই নির্দেশিকায় প্রমাণীকরণের জন্য পাসকি ব্যবহারের বাস্তবায়ন সম্পর্কে বিস্তারিত আলোচনা করা হয়েছে। আপনার ব্যবহারকারীরা পাসকি দিয়ে সাইন ইন করার আগে, আপনাকে অবশ্যই 'পাসকি তৈরি করুন' অংশের নির্দেশাবলীও সম্পন্ন করতে হবে।

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

সংক্ষিপ্ত বিবরণ

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

ব্যবহারকারীর অ্যাকাউন্টের সাথে যুক্ত সমস্ত পাসকি এবং পাসওয়ার্ড বিকল্পগুলি পুনরুদ্ধার করতে, এই ধাপগুলি সম্পূর্ণ করুন:

  1. সার্ভার থেকে ক্রেডেনশিয়াল অনুরোধের বিকল্পগুলি সংগ্রহ করুন : পাসকি সাইন-ইন প্রক্রিয়া শুরু করতে আপনার অ্যাপ থেকে আপনার অথেনটিকেশন সার্ভারে একটি অনুরোধ পাঠান। সার্ভার থেকে, পাবলিক কী ক্রেডেনশিয়াল পাওয়ার জন্য প্রয়োজনীয় বিকল্পগুলির পাশাপাশি একটি অনন্য চ্যালেঞ্জও পাঠান।
  2. পাবলিক কী ক্রেডেনশিয়াল পেতে প্রয়োজনীয় অবজেক্টটি তৈরি করুন : সার্ভার থেকে পাঠানো অপশনগুলোকে একটি GetPublicKeyCredentialOption অবজেক্টের মধ্যে রাখুন।
  3. ( ঐচ্ছিক) getCredential প্রস্তুত করুন : Android 14 এবং তার পরবর্তী সংস্করণগুলিতে, getCredential() prepareGetCredential() ) মেথডটি ব্যবহার করে অ্যাকাউন্ট সিলেক্টর দেখানোর মাধ্যমে আপনি ল্যাটেন্সি কমাতে পারেন।
  4. সাইন ইন প্রক্রিয়া চালু করুন : ব্যবহারকারীকে সাইন ইন করতে getCredential() মেথডটি কল করুন।
  5. প্রতিক্রিয়া পরিচালনা করুন : প্রতিটি সম্ভাব্য ক্রেডেনশিয়াল প্রতিক্রিয়া পরিচালনা করুন।
  6. ব্যতিক্রম পরিচালনা করুন : নিশ্চিত করুন যে আপনি ব্যতিক্রমগুলো যথাযথভাবে পরিচালনা করছেন।

সার্ভার থেকে পরিচয়পত্র অনুরোধের বিকল্পগুলি পান

পাবলিক কী ক্রেডেনশিয়াল এবং challenge পাওয়ার জন্য প্রয়োজনীয় অপশনগুলোর জন্য সার্ভারের কাছে অনুরোধ করুন, যা প্রতিটি সাইন-ইন প্রচেষ্টার জন্য অনন্য। সার্ভার-সাইড বাস্তবায়ন সম্পর্কে আরও জানতে, ‘চ্যালেঞ্জ তৈরি করুন’ এবং ‘ক্রেডেনশিয়াল অনুরোধের অপশন তৈরি করুন’ দেখুন।

বিকল্পগুলো দেখতে নিচের মতো:

{
  "challenge": "<your app challenge>",
  "allowCredentials": [],
  "rpId": "<your app server domain>"
}

ফিল্ডগুলো সম্পর্কে আরও জানতে, পাসকি দিয়ে সাইন ইন করার বিষয়ে ব্লগপোস্টটি দেখুন।

পাবলিক কী ক্রেডেনশিয়াল পেতে প্রয়োজনীয় অবজেক্টটি তৈরি করুন।

আপনার অ্যাপে, একটি GetPublicKeyCredentialOption অবজেক্ট তৈরি করতে অপশনগুলো ব্যবহার করুন। নিচের উদাহরণে, requestJson সার্ভার কর্তৃক প্রেরিত অপশনগুলোকে উপস্থাপন করে।

// Get password logins from the credential provider on the user's device.
val getPasswordOption = GetPasswordOption()

// Get passkeys from the credential provider on the user's device.
val getPublicKeyCredentialOption = GetPublicKeyCredentialOption(
    requestJson = requestJson
)

এরপর, GetPublicKeyCredentialOption একটি GetCredentialRequest অবজেক্টের মধ্যে রাখুন।

val credentialRequest = GetCredentialRequest(
    // Include all the sign-in options that your app supports.
    listOf(getPasswordOption, getPublicKeyCredentialOption),
    // Defines whether you prefer to use only immediately available
    // credentials or hybrid credentials.
    preferImmediatelyAvailableCredentials = preferImmediatelyAvailableCredentials
)

ঐচ্ছিক: সাইন-ইন বিলম্ব হ্রাস করুন

অ্যান্ড্রয়েড ১৪ বা তার পরবর্তী সংস্করণে, getCredential() কল করার আগে prepareGetCredential() ) মেথডটি ব্যবহার করে অ্যাকাউন্ট সিলেক্টর দেখানোর সময় ল্যাটেন্সি কমানো যায়।

prepareGetCredential() মেথডটি একটি PrepareGetCredentialResponse অবজেক্ট রিটার্ন করে যা ক্যাশ করা থাকে। এর ফলে পরবর্তী ধাপের getCredential() মেথডটি ক্যাশ করা ডেটা ব্যবহার করে অ্যাকাউন্ট সিলেক্টরটি প্রদর্শন করতে পারে।

coroutineScope {
    val response = credentialManager.prepareGetCredential(
        GetCredentialRequest(
            listOf(
                // Include all the sign-in options that your app supports
                getPublicKeyCredentialOption, 
                getPasswordOption
            )
        )
    )
}

সাইন-ইন প্রক্রিয়া চালু করুন

ব্যবহারকারীকে অ্যাকাউন্ট সিলেক্টর দেখানোর জন্য getCredential() মেথডটি কল করুন। সাইন-ইন ফ্লো কীভাবে চালু করতে হয়, তার রেফারেন্স হিসেবে নিম্নলিখিত কোড স্নিপেটটি ব্যবহার করুন:

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

প্রতিক্রিয়াটি সামলান।

প্রতিক্রিয়াটি পরিচালনা করুন, যেটিতে বিভিন্ন ধরণের ক্রেডেনশিয়াল অবজেক্ট থাকতে পারে।

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

    when (credential) {
        is PublicKeyCredential -> {
            val responseJson = credential.authenticationResponseJson
            // Share responseJson i.e. a GetCredentialResponse on your server to
            // validate and  authenticate
        }

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

        is CustomCredential -> {
            // If you are also using any external sign-in libraries, parse them
            // here with the utility functions provided.
            if (credential.type == ExampleCustomCredential.TYPE) {
                try {
                    val ExampleCustomCredential =
                        ExampleCustomCredential.createFrom(credential.data)
                    // Extract the required credentials and complete the authentication as per
                    // the federated sign in or any external sign in library flow
                } catch (e: ExampleCustomCredential.ExampleCustomCredentialParsingException) {
                    // Unlikely to happen. If it does, you likely need to update the dependency
                    // version of your external sign-in library.
                    Log.e(TAG, "Failed to parse an ExampleCustomCredential", 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")
        }
    }
}

প্রমাণীকরণ থেকে প্রাপ্ত PublicKeyCredential মূলত একটি স্বাক্ষরিত অ্যাসারশন, যার গঠন নিম্নরূপ:

{
  "id": "<credential ID>",
  "type": "public-key",
  "rawId": "<raw credential ID>",
  "response": {
    "clientDataJSON": "<signed client data containing challenge>",
    "authenticatorData": "<authenticator metadata>",
    "signature": "<digital signature to be verified>",
    "userHandle": "<user ID from credential registration>"
  }
}

সার্ভারে আপনাকে অবশ্যই ক্রেডেনশিয়ালটি যাচাই করতে হবে। আরও জানতে, “ব্যবহারকারীকে যাচাই ও সাইন ইন করুন” দেখুন।

ব্যতিক্রমগুলি পরিচালনা করুন

আপনাকে GetCredentialException এর সমস্ত সাবক্লাস এক্সেপশন হ্যান্ডেল করতে হবে। প্রতিটি এক্সেপশন কীভাবে হ্যান্ডেল করতে হয় তা জানতে, ট্রাবলশুটিং গাইডটি দেখুন।

coroutineScope {
    try {
        result = credentialManager.getCredential(
            context = activityContext,
            request = credentialRequest
        )
    } catch (e: GetCredentialException) {
        Log.e("CredentialManager", "No credential available", e)
    }
}

পরবর্তী পদক্ষেপ