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

এই নির্দেশিকাটি প্রমাণীকরণের জন্য পাসকি ব্যবহারের বাস্তবায়নের উপর অব্যাহত রয়েছে। আপনার ব্যবহারকারীরা পাসকি দিয়ে সাইন ইন করার আগে, আপনাকে Create passkeys এর নির্দেশাবলীও সম্পূর্ণ করতে হবে।

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

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

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

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

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

1. সার্ভার থেকে শংসাপত্র অনুরোধের বিকল্পগুলি পান

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

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

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

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

2. পাবলিক কী শংসাপত্র পেতে প্রয়োজনীয় বস্তু তৈরি করুন

আপনার অ্যাপে, 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() পদ্ধতিতে কল করুন। সাইন-ইন ফ্লো কীভাবে চালু করবেন তার জন্য রেফারেন্স হিসেবে নিম্নলিখিত কোড স্নিপেটটি ব্যবহার করুন:

coroutineScope {
    try {
        result = credentialManager.getCredential(
            // Use an activity-based context to avoid undefined system UI
            // launching behavior.
            context = activityContext,
            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)
    }
}

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