सिंगल टैप करके पासकी बनाने और बायोमेट्रिक प्रॉम्प्ट की मदद से साइन-इन करने की सुविधा इंटिग्रेट करें

Android 15 पर, क्रेडेंशियल मैनेजर, क्रेडेंशियल बनाने और वापस पाने के लिए, एक टैप वाले फ़्लो की सुविधा देता है. इस फ़्लो में, बनाए जा रहे या इस्तेमाल किए जा रहे क्रेडेंशियल की जानकारी, बायोमेट्रिक प्रॉम्प्ट में सीधे दिखती है. साथ ही, इसमें ज़्यादा विकल्प देखने के लिए एक एंट्री पॉइंट भी होता है. इस आसान प्रोसेस से, क्रेडेंशियल बनाने और वापस पाने की प्रोसेस ज़्यादा कारगर और बेहतर हो जाती है.

ज़रूरी शर्तें:

  • उपयोगकर्ता के डिवाइस पर बायोमेट्रिक डेटा सेट अप किया गया हो और उपयोगकर्ता ने ऐप्लिकेशन में अपनी पहचान की पुष्टि करने के लिए, बायोमेट्रिक डेटा इस्तेमाल करने की अनुमति दी हो.
  • साइन-इन फ़्लो के लिए, यह सुविधा सिर्फ़ एक खाते वाले सिनेरियो के लिए चालू की जाती है. भले ही, उस खाते के लिए एक से ज़्यादा क्रेडेंशियल (जैसे कि पासकी और पासवर्ड) उपलब्ध हों.

पासकी बनाने के फ़्लो में, एक टैप वाली सुविधा चालू करना

इस तरीके से क्रेडेंशियल बनाने के चरण, मौजूदा क्रेडेंशियल बनाने की प्रोसेस के चरणों जैसे ही होते हैं. अगर पासकी के लिए अनुरोध किया गया है, तो BeginCreatePublicKeyCredentialRequest में, अनुरोध को प्रोसेस करने के लिए handleCreatePasskeyQuery() का इस्तेमाल करें.

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

आपके handleCreatePasskeyQuery() में, BiometricPromptData को CreateEntry क्लास के साथ शामिल करें:

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 की तरह, PublicKeyCredentialEntry इंस्टेंस के लिए, BiometricPromptData इंस्टेंस सेट किया जाता है. अगर इसे साफ़ तौर पर सेट नहीं किया जाता है, तो 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 वगैरह. authenticationError में, errorCode से जुड़ा एक गड़बड़ी का मैसेज भी होगा, जिसे यूज़र इंटरफ़ेस (यूआई) पर दिखाया जा सकता है.

इसी तरह, 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...