ایجاد رمز عبور با یک ضربه و ورود به سیستم را با اعلان‌های بیومتریک ادغام کنید

در اندروید ۱۵، Credential Manager از یک جریان تک ضربه‌ای برای ایجاد و بازیابی اعتبارنامه پشتیبانی می‌کند. در این جریان، اطلاعات اعتبارنامه‌ای که ایجاد یا استفاده می‌شود، به همراه یک نقطه ورود به گزینه‌های بیشتر، مستقیماً در Biometric Prompt نمایش داده می‌شود. این فرآیند ساده‌شده، فرآیند ایجاد و بازیابی اعتبارنامه را کارآمدتر و ساده‌تر می‌کند.

الزامات:

  • بیومتریک‌ها روی دستگاه کاربر تنظیم شده‌اند و کاربر به آنها اجازه می‌دهد تا برای احراز هویت در برنامه‌ها از آنها استفاده کنند.
  • برای جریان‌های ورود به سیستم، این ویژگی فقط برای سناریوهای تک حساب کاربری فعال است، حتی اگر چندین اعتبارنامه (مانند کلید عبور و رمز عبور) برای آن حساب کاربری موجود باشد.

فعال کردن تک ضربه روی جریان‌های ایجاد کلید عبور

مراحل ایجاد این متد با فرآیند ایجاد اعتبارنامه موجود مطابقت دارد. در 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
    ),
)

ارائه‌دهندگان اعتبارنامه باید صریحاً ویژگی allowedAuthenticator در نمونه BiometricPromptData تنظیم کنند. اگر این ویژگی تنظیم نشده باشد، مقدار پیش‌فرض 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
    )
)

مدیریت انتخاب ورودی اعتبارنامه

هنگام مدیریت انتخاب ورودی اعتبارنامه برای ایجاد کلید عبور یا انتخاب کلید عبور در هنگام ورود ، در صورت لزوم، retrieveProviderCreateCredentialRequest یا retrieveProviderGetCredentialRequest PendingIntentHandler's retrieveProviderCreateCredentialRequest فراخوانی کنید. این اشیاء، متادیتای مورد نیاز برای ارائه دهنده را برمی‌گردانند. برای مثال، هنگام مدیریت انتخاب ورودی ایجاد کلید عبور، کد خود را مطابق زیر به‌روزرسانی کنید:

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 است یا خیر. اگر بله، بیومتریک‌های خود را برای احراز هویت پیکربندی کنید. این مشابه نحوه‌ی ابزاربندی عملیات 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...