একবার ট্যাপ করে পাসকী তৈরি করা এবং বায়োমেট্রিক প্রম্পটের মাধ্যমে সাইন-ইন করার সুবিধা ইন্টিগ্রেট করুন

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

প্রয়োজনীয়তা:

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

পাসকী তৈরির ফ্লোতে একবার ট্যাপ করার সুবিধা চালু করুন

এই পদ্ধতির তৈরির ধাপগুলি আগে থেকে থাকা ক্রেডেনশিয়াল তৈরির প্রক্রিয়ার সাথে মেলে। আপনার BeginCreatePublicKeyCredentialRequest-এর মধ্যে, অনুরোধটি পাসকী সংক্রান্ত হলে, সেটি প্রসেস করতে handleCreatePasskeyQuery() ব্যবহার করুন।

is BeginCreatePublicKeyCredentialRequest -> {
    Log.i(TAG, "Request is passkey type")
    return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)
}

আপনার handleCreatePasskeyQuery()-এ, CreateEntry ক্লাসের সাথে BiometricPromptData অন্তর্ভুক্ত করুন:

val createEntry = CreateEntry(
    // Additional properties...
    biometricPromptData = BiometricPromptData(
        allowedAuthenticators = allowedAuthenticator
    ),
)

ক্রেডেনশিয়াল প্রদানকারীকে BiometricPromptData ইনস্ট্যান্সে allowedAuthenticator প্রপার্টি স্পষ্টভাবে সেট করতে হবে। এই প্রপার্টি সেট করা না থাকলে, ভ্যালু ডিফল্ট হিসেবে DEVICE_WEAK-এ সেট করা হয়। প্রয়োজন হলে, আপনার ব্যবহারের জন্য ঐচ্ছিক cryptoObject প্রপার্টি সেট করুন।

সাইন-ইন পাসকী ফ্লোতে একবার ট্যাপ করার সুবিধা চালু করুন

পাসকী তৈরি করার ফ্লোয়ের মতোই, এটি ব্যবহারকারীর সাইন-ইন ম্যানেজ করার জন্য আগে থেকে থাকা সেট-আপ অনুসরণ করবে। BeginGetPublicKeyCredentialOption-এর অধীনে, যাচাইকরণের অনুরোধ সম্পর্কে প্রাসঙ্গিক তথ্য সংগ্রহ করতে populatePasskeyData() ব্যবহার করুন:

is BeginGetPublicKeyCredentialOption -> {
    // ... other logic

    populatePasskeyData(
        origin,
        option,
        responseBuilder,
        autoSelectEnabled,
        allowedAuthenticator
    )

    // ... other logic as needed
}

CreateEntry-এর মতো, BiometricPromptData ইনস্ট্যান্স PublicKeyCredentialEntry ইনস্ট্যান্সে সেট করা হয়েছে। স্পষ্টভাবে সেট করা না থাকলে, allowedAuthenticator ডিফল্ট হিসেবে BIOMETRIC_WEAK-এ সেট করা হয়।

PublicKeyCredentialEntry(
    // other properties...

    biometricPromptData = BiometricPromptData(
        allowedAuthenticators = allowedAuthenticator
    )
)

ক্রেডেনশিয়াল এন্ট্রি বেছে নেওয়ার বিষয়টি ম্যানেজ করুন

পাসকী তৈরি করা বা সাইন-ইন করার সময় পাসকী বেছে নেওয়ার জন্য ক্রেডেনশিয়াল এন্ট্রি বেছে নেওয়ার সময়, উপযুক্ত হলে PendingIntentHandler's retrieveProviderCreateCredentialRequest বা retrieveProviderGetCredentialRequest কল করুন। এগুলি অবজেক্ট রিটার্ন করে যেগুলিতে পরিষেবা প্রদানকারীর জন্য প্রয়োজনীয় মেটাডেটা থাকে। যেমন, পাসকী তৈরি করার এন্ট্রি বেছে নেওয়ার সময়, আপনার কোড আপডেট করুন, যেমন দেখানো হয়েছে:

val createRequest = PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)
if (createRequest == null) {
    Log.i(TAG, "request is null")
    setUpFailureResponseAndFinish("Unable to extract request from intent")
    return
}
// Other logic...

val biometricPromptResult = createRequest.biometricPromptResult

// Add your logic based on what needs to be done
// after getting biometrics

if (createRequest.callingRequest is CreatePublicKeyCredentialRequest) {
    val publicKeyRequest: CreatePublicKeyCredentialRequest =
        createRequest.callingRequest as CreatePublicKeyCredentialRequest

    if (biometricPromptResult == null) {
        // Do your own authentication flow, if needed
    } else if (biometricPromptResult.isSuccessful) {
        createPasskey(
            publicKeyRequest.requestJson,
            createRequest.callingAppInfo,
            publicKeyRequest.clientDataHash,
            accountId
        )
    } else {
        val error = biometricPromptResult.authenticationError
        // Process the error
    }

    // Other logic...
}

এই উদাহরণে বায়োমেট্রিক ফ্লো সফল হওয়ার ব্যাপারে তথ্য আছে। এছাড়াও, এতে ক্রেডেনশিয়াল সম্পর্কে অন্যান্য তথ্য থাকে। ফ্লো কাজ না করলে, সিদ্ধান্ত নিতে biometricPromptResult.authenticationError-এর অধীনে থাকা ত্রুটি কোড ব্যবহার করুন। biometricPromptResult.authenticationError.errorCode-এর অংশ হিসেবে ফেরত আসা ত্রুটি কোডগুলি androidx.biometric লাইব্রেরিতে সংজ্ঞায়িত একই ত্রুটি কোড, যেমন androidx.biometric.BiometricPrompt.ERROR_NO_SPACE, androidx.biometric.BiometricPrompt.ERROR_UNABLE_TO_PROCESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT এবং এই ধরনের অন্যান্য। authenticationError-এ errorCode-এর সাথে সম্পর্কিত একটি সমস্যার মেসেজও থাকবে যা UI-তে দেখানো যেতে পারে।

একইভাবে, retrieveProviderGetCredentialRequest-এর সময় মেটাডেটা এক্সট্র্যাক্ট করুন। আপনার বায়োমেট্রিক ফ্লো null কিনা তা চেক করুন। যদি হ্যাঁ হয়, তাহলে যাচাই করার জন্য আপনার নিজের বায়োমেট্রিক্স কনফিগার করুন। অপারেশন পান যেভাবে ইন্সট্রুমেন্ট করা হয়, এটিও ঠিক সেইরকম:

val getRequest =
    PendingIntentHandler.retrieveProviderGetCredentialRequest(intent)

if (getRequest == null) {
    Log.i(TAG, "request is null")
    setUpFailureResponseAndFinish("Unable to extract request from intent")
    return
}

// Other logic...

val biometricPromptResult = getRequest.biometricPromptResult

// Add your logic based on what needs to be done
// after getting biometrics

if (biometricPromptResult == null) {
    // Do your own authentication flow, if necessary
} else if (biometricPromptResult.isSuccessful) {

    Log.i(TAG, "The response from the biometricPromptResult was ${biometricPromptResult.authenticationResult?.authenticationType}")

    validatePasskey(
        publicKeyRequest.requestJson,
        origin,
        packageName,
        uid,
        passkey.username,
        credId,
        privateKey
    )
} else {
    val error = biometricPromptResult.authenticationError
    // Process the error
}

// Other logic...