Tek dokunuşla geçiş anahtarı oluşturma ve oturum açmayı biyometrik istemlerle entegre edin

Android 15'te Kimlik Bilgisi Yöneticisi, kimlik bilgileri için tek dokunuşla akışı destekler. Ürün Sahibi sorumludur. Bu akışta, oluşturulmakta veya kullanılmakta olan kimlik bilgisinin bilgileri, daha fazla seçeneğe erişim noktasıyla birlikte doğrudan Biyometrik İstem'de gösterilir. Bu basitleştirilmiş süreç, kimlik bilgisi oluşturma ve alma sürecini daha verimli ve basit hale getirir.

Koşullar:

  • Kullanıcının cihazında biyometri ayarlanmış ve kullanıcı, uygulamalarda kimlik doğrulama için biyometriye izin vermiş olmalıdır.
  • Oturum açma akışlarında bu özellik, ilgili hesap için birden fazla kimlik bilgisi (ör. geçiş anahtarı ve şifre) olsa bile yalnızca tek hesap senaryolarında etkindir.

Geçiş anahtarı oluşturma akışlarında tek dokunuşları etkinleştir

Bu yöntemin oluşturma adımları, mevcut kimlik bilgisi oluşturma süreciyle eşleşir. BeginCreatePublicKeyCredentialRequest içinde, Geçiş anahtarı içinse isteği işlemek üzere handleCreatePasskeyQuery().

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

handleCreatePasskeyQuery() sayfanıza BiometricPromptData ekleyin ve CreateEntry sınıfı:

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

Kimlik bilgisi sağlayıcılar, BiometricPromptData örneğinde allowedAuthenticator mülkünü açıkça ayarlamalıdır. Bu özellik ayarlanmazsa varsayılan olarak DEVICE_WEAK değerine ayarlanır. Gerekirse isteğe bağlı cryptoObject özelliğini ayarlayın bir şablon görevi görür.

Tek dokunuşla oturum açma geçiş anahtarı akışlarını etkinleştir

Geçiş anahtarı oluşturma akışına benzer şekilde, bu işlem kullanıcı oturum açma işlemini yönetme için mevcut kurulumu izler. Kimlik doğrulama isteğiyle ilgili bilgileri toplamak için BeginGetPublicKeyCredentialOption altında populatePasskeyData()'u kullanın:

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

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

  // ... other logic as needed
}

CreateEntry'e benzer şekilde, BiometricPromptData örneği PublicKeyCredentialEntry örneğine ayarlanır. Açıkça belirtilmediği takdirde allowedAuthenticator, varsayılan olarak BIOMETRIC_WEAK değerine ayarlıdır.

PublicKeyCredentialEntry(
  // other properties...

  biometricPromptData = BiometricPromptData(
    allowedAuthenticators = allowedAuthenticator
  )
)

Kimlik bilgisi girişi seçimini işleme

Geçiş anahtarı oluşturma için kimlik bilgisi girişi seçimini işlerken veya oturum açma sırasında geçiş anahtarı seçimi, PendingIntentHandler's retrieveProviderCreateCredentialRequest numaralı telefonu arayın veya retrieveProviderGetCredentialRequest (uygun şekilde). Bunlar nesne döndürür içeren bir liste oluşturabilirsiniz. Örneğin, geçiş anahtarı oluşturma girişi seçimini işlerken kodunuzu aşağıdaki gibi güncelleyin:

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

Bu örnek, biyometrik akışın başarısıyla ilgili bilgiler içerir. Aynı zamanda kimlik bilgisi hakkında başka bilgiler içerir. Akış başarısız olursa biometricPromptResult.authenticationError altındaki hata kodunu girin. Bu hatanın bir parçası olarak döndürülen hata kodları biometricPromptResult.authenticationError.errorCode aynı hata kodlarıdır örneğin, androidx.biyometrik kitaplığında androidx.biometric.BiometricPrompt.NO_SPACE, androidx.biometric.BiometricPrompt.UNABLE_TO_İŞLEM, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT vb. authenticationError, kullanıcı arayüzünde gösterilebilecek errorCode ile ilişkili bir hata mesajı da içerir.

Benzer şekilde, retrieveProviderGetCredentialRequest sırasında meta verileri ayıklayın. Biyometrik akışkanınızın null olup olmadığını kontrol edin. Cevabınız evet ise kendi biyometrinizi şu şekilde yapılandırın: kimlik doğrulama. Bu, get işleminin araçlandırılmasına benzer:

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