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

অ্যান্ড্রয়েড ১৫-এ, ক্রেডেনশিয়াল ম্যানেজার ক্রেডেনশিয়াল তৈরি এবং পুনরুদ্ধারের জন্য একটি সিঙ্গেল-ট্যাপ ফ্লো সমর্থন করে। এই ফ্লো-তে, তৈরি করা বা ব্যবহৃত ক্রেডেনশিয়ালের তথ্য সরাসরি বায়োমেট্রিক প্রম্পটে প্রদর্শিত হয় এবং এর সাথে আরও অপশনের জন্য একটি এন্ট্রি-পয়েন্টও থাকে। এই সরলীকৃত প্রক্রিয়াটি ক্রেডেনশিয়াল তৈরি এবং পুনরুদ্ধারের প্রক্রিয়াকে আরও কার্যকর ও সুসংগঠিত করে তোলে।

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

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

পাসকি তৈরির ফ্লো-তে সিঙ্গেল ট্যাপ সক্ষম করুন

এই মেথডটি তৈরির ধাপগুলো বিদ্যমান ক্রেডেনশিয়াল তৈরির প্রক্রিয়ার সাথে মিলে যায়। আপনার 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.NO_SPACE , androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS , androidx.biometric.BiometricPrompt.ERROR_TIMEOUT এবং এই ধরনের অন্যান্য কোড। authenticationErrorerrorCode এর সাথে সম্পর্কিত একটি এরর মেসেজও থাকবে, যা একটি UI-তে প্রদর্শন করা যেতে পারে।

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

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...