Integrasikan pembuatan kunci sandi sekali ketuk dan login dengan perintah biometrik

Di Android 15, Pengelola Kredensial mendukung alur sekali ketuk untuk pembuatan dan pengambilan kredensial. Dalam alur ini, informasi kredensial yang dibuat, atau sedang digunakan, ditampilkan langsung di Biometric Prompt, bersama titik entri ke opsi lainnya. Proses yang disederhanakan ini menciptakan proses pembuatan dan pengambilan kredensial yang lebih efisien dan sederhana.

Persyaratan:

  • Biometrik telah disiapkan di perangkat pengguna dan pengguna mengizinkannya untuk autentikasi ke aplikasi.
  • Untuk alur login, fitur ini hanya diaktifkan 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 ditujukan 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, nilainya akan ditetapkan secara default ke DEVICE_WEAK. Tetapkan properti cryptoObject opsional jika diperlukan untuk kasus penggunaan Anda.

Mengaktifkan sekali ketuk pada alur kunci sandi login

Serupa dengan alur pembuatan kunci sandi, hal 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. Jenis ini menampilkan objek yang berisi metadata yang diperlukan untuk penyedia. Misalnya, saat menangani pemilihan 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. File ini 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 yang ditentukan dalam library androidx.biometric, seperti androidx.biometric.BiometricPrompt.NO_SPACE, androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT, dan yang serupa. 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...