ایجاد رمز عبور با یک ضربه و ورود به سیستم را با اعلانهای بیومتریک ادغام کنید
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
در Android 15، Credential Manager از یک جریان ضربه برای ایجاد و بازیابی اعتبار پشتیبانی می کند. در این جریان، اطلاعات اعتبار در حال ایجاد یا استفاده مستقیماً در اعلان بیومتریک به همراه یک نقطه ورود به گزینه های بیشتر نمایش داده می شود. این فرآیند ساده، فرآیند ایجاد و بازیابی اعتبار کارآمدتر و کارآمدتر را ایجاد می کند.
الزامات:
بیومتریک بر روی دستگاه کاربر تنظیم شده است و کاربر به آنها اجازه می دهد تا در برنامه ها احراز هویت شوند.
برای جریانهای ورود به سیستم، این ویژگی فقط برای سناریوهای تک حساب فعال است، حتی اگر چندین اعتبار (مانند رمز عبور و رمز عبور) برای آن حساب موجود باشد.
فعال کردن یک ضربه روی جریان ایجاد رمز عبور
مراحل ایجاد این روش با فرآیند ایجاد اعتبار موجود مطابقت دارد. در BeginCreatePublicKeyCredentialRequest خود، از handleCreatePasskeyQuery() برای پردازش درخواست در صورتی که برای یک رمز عبور است استفاده کنید.
isBeginCreatePublicKeyCredentialRequest->{Log.i(TAG,"Request is passkey type")returnhandleCreatePasskeyQuery(request,passwordCount,passkeyCount)}
در handleCreatePasskeyQuery() خود، BiometricPromptData با کلاس CreateEntry قرار دهید:
ارائه دهندگان اعتبار باید به صراحت خاصیت allowedAuthenticator را در نمونه BiometricPromptData تنظیم کنند. اگر این ویژگی تنظیم نشده باشد، مقدار پیشفرض DEVICE_WEAK است. در صورت نیاز، ویژگی اختیاری cryptoObject را برای مورد استفاده خود تنظیم کنید.
یک ضربه زدن روی جریان های رمز ورود به سیستم فعال کنید
مشابه جریان ایجاد کلید عبور، این کار از تنظیمات موجود برای مدیریت ورود کاربر پیروی می کند. در زیر BeginGetPublicKeyCredentialOption ، از populatePasskeyData() برای جمع آوری اطلاعات مربوطه در مورد درخواست احراز هویت استفاده کنید:
isBeginGetPublicKeyCredentialOption->{// ... other logicpopulatePasskeyData(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 تماس بگیرید. این اشیاء که حاوی ابرداده های مورد نیاز برای ارائه دهنده هستند را برمی گرداند. به عنوان مثال، هنگام مدیریت انتخاب ورودی ایجاد رمز عبور، کد خود را مطابق شکل به روز کنید:
valcreateRequest=PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)if(createRequest==null){Log.i(TAG,"request is null")setUpFailureResponseAndFinish("Unable to extract request from intent")return}// Other logic...valbiometricPromptResult=createRequest.biometricPromptResult// Add your logic based on what needs to be done// after getting biometricsif(createRequest.callingRequestisCreatePublicKeyCredentialRequest){valpublicKeyRequest:CreatePublicKeyCredentialRequest=createRequest.callingRequestasCreatePublicKeyCredentialRequestif(biometricPromptResult==null){// Do your own authentication flow, if needed}elseif(biometricPromptResult.isSuccessful){createPasskey(publicKeyRequest.requestJson,createRequest.callingAppInfo,publicKeyRequest.clientDataHash,accountId)}else{valerror=biometricPromptResult.authenticationError// Process the error}// Other logic...}
این مثال حاوی اطلاعاتی در مورد موفقیت جریان بیومتریک است. همچنین حاوی اطلاعات دیگری در مورد اعتبارنامه است. اگر جریان ناموفق بود، از کد خطا در زیر biometricPromptResult.authenticationError برای تصمیم گیری استفاده کنید. کدهای خطای بازگشتی به عنوان بخشی از biometricPromptResult.authenticationError.errorCode همان کدهای خطای تعریف شده در کتابخانه androidx.biometric هستند، مانند androidx.biometric.BiometricPrompt.NO_SPACE ، androidx.biometric.BiometricPrompt.UNABLE_TO_androidx.biometric.BiometricPrompt.ERROR_TIMEOUT و موارد مشابه. authenticationError همچنین حاوی یک پیغام خطایی مرتبط با errorCode است که می تواند در یک UI نمایش داده شود.
به طور مشابه، فراداده را در طول retrieveProviderGetCredentialRequest استخراج کنید. بررسی کنید که آیا جریان بیومتریک شما null است یا خیر. اگر بله، بیومتریک خود را برای احراز هویت پیکربندی کنید. این شبیه نحوه ابزارگیری عملیات get است:
valgetRequest=PendingIntentHandler.retrieveProviderGetCredentialRequest(intent)if(getRequest==null){Log.i(TAG,"request is null")setUpFailureResponseAndFinish("Unable to extract request from intent")return}// Other logic...valbiometricPromptResult=getRequest.biometricPromptResult// Add your logic based on what needs to be done// after getting biometricsif(biometricPromptResult==null){// Do your own authentication flow, if necessary}elseif(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{valerror=biometricPromptResult.authenticationError// Process the error}// Other logic...
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-08-27 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","easyToUnderstand","thumb-up"],["مشکلم را برطرف کرد","solvedMyProblem","thumb-up"],["غیره","otherUp","thumb-up"]],[["اطلاعاتی که نیاز دارم وجود ندارد","missingTheInformationINeed","thumb-down"],["بیشازحد پیچیده/ مراحل بسیار زیاد","tooComplicatedTooManySteps","thumb-down"],["قدیمی","outOfDate","thumb-down"],["مشکل ترجمه","translationIssue","thumb-down"],["مشکل کد / نمونهها","samplesCodeIssue","thumb-down"],["غیره","otherDown","thumb-down"]],["تاریخ آخرین بهروزرسانی 2025-08-27 بهوقت ساعت هماهنگ جهانی."],[],[],null,["# Integrate single tap passkey creation and sign-in with biometric prompts\n\nOn Android 15, Credential Manager supports a single tap flow for credential\ncreation and retrieval. In this flow, the information of the credential being\ncreated, or being used, is displayed directly in the Biometric Prompt, along\nwith an entrypoint to more options. This simplified process creates a more\nefficient and streamlined credential creation and retrieval process.\n\n**Requirements:**\n\n- Biometrics have been set up on the user's device and the user allows them for authentication into applications.\n- For sign-in flows, this feature is enabled for single account scenarios only, even if there's multiple credentials (such as passkey and password) available for that account.\n\nEnable single tap on passkey creation flows\n-------------------------------------------\n\nThis method's creation steps match the [existing credential creation\nprocess](/identity/sign-in/credential-provider#handle-passkey-creation). Within your `BeginCreatePublicKeyCredentialRequest`, use\n`handleCreatePasskeyQuery()` to process the request if it is for a passkey. \n\n is BeginCreatePublicKeyCredentialRequest -\u003e {\n Log.i(TAG, \"Request is passkey type\")\n return handleCreatePasskeyQuery(request, passwordCount, passkeyCount)\n }\n\nIn your `handleCreatePasskeyQuery()`, include [`BiometricPromptData`](/reference/kotlin/androidx/credentials/provider/BiometricPromptData) with\nthe `CreateEntry` class: \n\n val createEntry = CreateEntry(\n // Additional properties...\n biometricPromptData = BiometricPromptData(\n allowedAuthenticators = allowedAuthenticator\n ),\n )\n\nCredential providers should explicitly set the `allowedAuthenticator` property\nin the `BiometricPromptData` instance. If this property is not set, the value\ndefaults to `DEVICE_WEAK`. Set the optional `cryptoObject` property if needed\nfor your use case.\n| **Note:** If the device is configured to use `DEVICE_CREDENTIALS` to require a PIN or passcode for authentication---regardless of whether biometrics are available or enabled---the standard credential manager flow will be used instead of the single-tap flow. This means the provider will always receive a `null` value for `biometricPromptResult` in these scenarios.\n\nEnable single tap on sign-in passkey flows\n------------------------------------------\n\nSimilar to the passkey creation flow, this will follow the existing setup for\n[handling user sign-in](/identity/sign-in/credential-provider#handle-user-sign-in). Under the `BeginGetPublicKeyCredentialOption`, use\n`populatePasskeyData()` to gather the relevant information about the\nauthentication request: \n\n is BeginGetPublicKeyCredentialOption -\u003e {\n // ... other logic\n\n populatePasskeyData(\n origin,\n option,\n responseBuilder,\n autoSelectEnabled,\n allowedAuthenticator\n )\n\n // ... other logic as needed\n }\n\nSimilar to `CreateEntry`, a `BiometricPromptData` instance is set to the\n`PublicKeyCredentialEntry` instance. If not explicitly set,\n`allowedAuthenticator` defaults to `BIOMETRIC_WEAK`. \n\n PublicKeyCredentialEntry(\n // other properties...\n\n biometricPromptData = BiometricPromptData(\n allowedAuthenticators = allowedAuthenticator\n )\n )\n\n| **Note:** The user is presented with a biometric authentication option if their device supports it and they have granted permission for its use. The code is similar to the previous example, with the addition of a [`cryptoObject`](/reference/androidx/biometric/BiometricPrompt.CryptoObject).\n\nHandle credential entry selection\n---------------------------------\n\nWhile handling the credential entry selection for [passkey creation](/identity/sign-in/credential-provider#handle-passkey-credential) or\n[passkey selection during sign in](/identity/sign-in/credential-provider#passkeys-implement), call the `PendingIntentHandler's\nretrieveProviderCreateCredentialRequest`, or\n`retrieveProviderGetCredentialRequest`, as appropriate. These return objects\nthat contain the metadata needed for the provider. For example, when handling\npasskey creation entry selection, update your code as shown: \n\n val createRequest = PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)\n if (createRequest == null) {\n Log.i(TAG, \"request is null\")\n setUpFailureResponseAndFinish(\"Unable to extract request from intent\")\n return\n }\n // Other logic...\n\n val biometricPromptResult = createRequest.biometricPromptResult\n\n // Add your logic based on what needs to be done\n // after getting biometrics\n\n if (createRequest.callingRequest is CreatePublicKeyCredentialRequest) {\n val publicKeyRequest: CreatePublicKeyCredentialRequest =\n createRequest.callingRequest as CreatePublicKeyCredentialRequest\n\n if (biometricPromptResult == null) {\n // Do your own authentication flow, if needed\n } else if (biometricPromptResult.isSuccessful) {\n createPasskey(\n publicKeyRequest.requestJson,\n createRequest.callingAppInfo,\n publicKeyRequest.clientDataHash,\n accountId\n )\n } else {\n val error = biometricPromptResult.authenticationError\n // Process the error\n }\n\n // Other logic...\n }\n\nThis example contains information about the biometric flow's success. It also\ncontains other information about the credential. If the flow fails, use the\nerror code under `biometricPromptResult.authenticationError` to make decisions.\nThe error codes returned as part of\n`biometricPromptResult.authenticationError.errorCode` are the same error codes\ndefined in the androidx.biometric library, such as\n[androidx.biometric.BiometricPrompt.NO_SPACE](/reference/androidx/biometric/BiometricPrompt#ERROR_NO_SPACE()),\n[androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS](/identity/sign-in/androidx.biometric.BiometricPrompt.NO_SPACE),\n[androidx.biometric.BiometricPrompt.ERROR_TIMEOUT](/reference/androidx/biometric/BiometricPrompt#ERROR_TIMEOUT()), and similar. The\n`authenticationError` will also contain an error message associated with the\n`errorCode` that can be displayed on a UI.\n\nSimilarly, extract metadata during the `retrieveProviderGetCredentialRequest`.\nCheck if your biometric flow is `null`. If yes, configure your own biometrics to\nauthenticate. This is similar to how the [get operation](/identity/sign-in/credential-provider#passkeys-implement) is instrumented: \n\n val getRequest =\n PendingIntentHandler.retrieveProviderGetCredentialRequest(intent)\n\n if (getRequest == null) {\n Log.i(TAG, \"request is null\")\n setUpFailureResponseAndFinish(\"Unable to extract request from intent\")\n return\n }\n\n // Other logic...\n\n val biometricPromptResult = getRequest.biometricPromptResult\n\n // Add your logic based on what needs to be done\n // after getting biometrics\n\n if (biometricPromptResult == null) {\n // Do your own authentication flow, if necessary\n } else if (biometricPromptResult.isSuccessful) {\n\n Log.i(TAG, \"The response from the biometricPromptResult was ${biometricPromptResult.authenticationResult?.authenticationType}\")\n\n validatePasskey(\n publicKeyRequest.requestJson,\n origin,\n packageName,\n uid,\n passkey.username,\n credId,\n privateKey\n )\n } else {\n val error = biometricPromptResult.authenticationError\n // Process the error\n }\n\n // Other logic..."]]