Integrasikan pembuatan kunci sandi sekali ketuk dan login dengan perintah biometrik

Di Android 15, Pengelola Kredensial mendukung alur sekali ketuk untuk kredensial pembuatan dan pengambilan data. Dalam alur ini, informasi kredensial yang dibuat, atau sedang digunakan, ditampilkan langsung di Biometric Prompt, beserta dengan titik masuk ke lebih banyak opsi. Proses yang disederhanakan ini memberikan pembuatan dan pengambilan kredensial yang efisien dan efisien.

Persyaratan:

  • Biometrik telah disiapkan di perangkat pengguna dan pengguna mengizinkannya untuk otentikasi ke dalam aplikasi.
  • Untuk alur login, fitur ini diaktifkan hanya untuk skenario satu akun, meskipun ada beberapa kredensial (seperti kunci sandi dan sandi) yang tersedia untuk akun tersebut.

Mengaktifkan sekali ketuk pada alur pembuatan kunci sandi

Langkah-langkah pembuatan metode ini cocok dengan proses pembuatan kredensial yang ada. Dalam BeginCreatePublicKeyCredentialRequest, gunakan handleCreatePasskeyQuery() untuk memproses permintaan jika permintaan tersebut untuk kunci sandi.

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

Di handleCreatePasskeyQuery(), sertakan BiometricPromptData dengan class CreateEntry:

val createEntry = CreateEntry(
  // Additional properties...
  biometricPromptData = BiometricPromptData(
    allowedAuthenticators = allowedAuthenticator
  )
)

Penyedia kredensial harus menetapkan properti allowedAuthenticator secara eksplisit dalam instance BiometricPromptData. Jika properti ini tidak ditetapkan, nilai nilai defaultnya adalah DEVICE_WEAK. Tetapkan properti cryptoObject opsional jika diperlukan untuk kasus penggunaan Anda.

Aktifkan alur kunci sandi login dengan sekali ketuk

Mirip dengan alur pembuatan kunci sandi, alur ini akan mengikuti penyiapan yang ada untuk menangani login pengguna. Di bagian BeginGetPublicKeyCredentialOption, gunakan populatePasskeyData() untuk mengumpulkan informasi yang relevan tentang permintaan autentikasi:

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

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

  // ... other logic as needed
}

Serupa dengan CreateEntry, instance BiometricPromptData ditetapkan ke instance PublicKeyCredentialEntry. Jika tidak ditetapkan secara eksplisit, allowedAuthenticator akan ditetapkan secara default ke BIOMETRIC_WEAK.

PublicKeyCredentialEntry(
  // other properties...

  biometricPromptData = BiometricPromptData(
    allowedAuthenticators = allowedAuthenticator
  )
)

Menangani pemilihan entri kredensial

Saat menangani pemilihan entri kredensial untuk pembuatan kunci sandi atau pemilihan kunci sandi selama login, panggil PendingIntentHandler's retrieveProviderCreateCredentialRequest, atau retrieveProviderGetCredentialRequest, sebagaimana mestinya. Objek yang ditampilkan ini yang berisi {i>metadata <i} yang dibutuhkan oleh penyedia. Misalnya, saat menangani pilihan entri pembuatan kunci sandi, perbarui kode Anda seperti yang ditunjukkan:

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

Contoh ini berisi informasi tentang keberhasilan alur biometrik. Anda juga berisi informasi lain tentang kredensial. Jika alur gagal, gunakan kode error di bagian biometricPromptResult.authenticationError untuk membuat keputusan. Kode error yang ditampilkan sebagai bagian dari biometricPromptResult.authenticationError.errorCode adalah kode error yang sama ditentukan dalam library androidx.biometric, seperti androidx.biometric.BiometricPrompt.NO_SPACE, androidx.biometric.BiometricPrompt.UNABLE_TO_PROGRESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT, dan yang serupa. Tujuan authenticationError juga akan berisi pesan error yang terkait dengan errorCode yang dapat ditampilkan di UI.

Demikian pula, ekstrak metadata selama retrieveProviderGetCredentialRequest. Periksa apakah alur biometrik Anda adalah null. Jika ya, konfigurasikan biometrik Anda sendiri untuk melakukan autentikasi. Hal ini mirip dengan cara instrumentasi operasi 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.authenitcationError
    // Process the error
}

  // Other logic...