ผสานรวมการสร้างพาสคีย์ด้วยการแตะเพียงครั้งเดียวและการลงชื่อเข้าใช้ด้วยพรอมต์ข้อมูลไบโอเมตริก

ใน 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
  )
)

ผู้ให้บริการข้อมูลเข้าสู่ระบบควรตั้งค่าพร็อพเพอร์ตี้ allowedAuthenticator ในอินสแตนซ์ BiometricPromptData อย่างชัดแจ้ง หากไม่ได้ตั้งค่าพร็อพเพอร์ตี้นี้ ค่าเริ่มต้นจะเป็น DEVICE_WEAK ตั้งค่าพร็อพเพอร์ตี้ cryptoObject ที่ไม่บังคับหากจําเป็นสำหรับกรณีการใช้งาน

เปิดใช้การแตะครั้งเดียวในขั้นตอนการลงชื่อเข้าใช้ด้วยพาสคีย์

การดำเนินการนี้จะเป็นไปตามการตั้งค่าที่มีอยู่สำหรับการจัดการการลงชื่อเข้าใช้ของผู้ใช้ ซึ่งคล้ายกับขั้นตอนการสร้างพาสคีย์ ในส่วน BeginGetPublicKeyCredentialOption ให้ใช้ populatePasskeyData() เพื่อรวบรวมข้อมูลที่เกี่ยวข้องเกี่ยวกับคำขอตรวจสอบสิทธิ์

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

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

  // ... other logic as needed
}

อินสแตนซ์ BiometricPromptData ได้รับการตั้งค่าเป็นอินสแตนซ์ PublicKeyCredentialEntry เช่นเดียวกับ CreateEntry หากไม่ได้ตั้งค่าไว้อย่างชัดแจ้ง ระบบจะใช้ 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.authenitcationError
    // 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 ซึ่งแสดงใน 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.authenitcationError
    // Process the error
}

  // Other logic...