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

Android 15'te Kimlik Bilgisi Yöneticisi, kimlik bilgisi oluşturma ve alma için tek dokunma akışını destekler. Bu akışta, oluşturulan veya kullanılan kimlik bilgilerinin yanı sıra daha fazla seçeneğe yönelik bir giriş noktası doğrudan Biyometrik İstem'de gösterilir. Bu basitleştirilmiş süreç, daha verimli ve kolay bir kimlik bilgisi oluşturma ve alma süreci sağlar.

Koşullar:

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

Geçiş anahtarı oluşturma akışlarında tek dokunmayı etkinleştirme

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

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

handleCreatePasskeyQuery() içinde CreateEntry sınıfıyla birlikte BiometricPromptData öğesini ekleyin:

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

Kimlik bilgisi sağlayıcılar, BiometricPromptData örneğinde allowedAuthenticator özelliğini açıkça ayarlamalıdır. Bu özellik ayarlanmazsa değer varsayılan olarak DEVICE_WEAK olur. Kullanım alanınız için gerekirse isteğe bağlı cryptoObject özelliğini ayarlayın.

Oturum açma geçiş anahtarı akışlarında tek dokunma özelliğini etkinleştirme

Geçiş anahtarı oluşturma akışına benzer şekilde, bu işlem de kullanıcı oturum açma işlemlerini yönetmek için mevcut kurulumu takip eder. BeginGetPublicKeyCredentialOption bölümünde, kimlik doğrulama isteğiyle ilgili bilgileri toplamak için populatePasskeyData() seçeneğini kullanın:

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

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

    // ... other logic as needed
}

CreateEntry'ya benzer şekilde, BiometricPromptData örneği PublicKeyCredentialEntry örneğine ayarlanır. Açıkça ayarlanmamışsa, allowedAuthenticator varsayılan olarak BIOMETRIC_WEAK olur.

PublicKeyCredentialEntry(
    // other properties...

    biometricPromptData = BiometricPromptData(
        allowedAuthenticators = allowedAuthenticator
    )
)

Kimlik bilgisi girişi seçimini işleme

Geçiş anahtarı oluşturma veya oturum açma sırasında geçiş anahtarı seçme için kimlik bilgisi girişi seçimini işlerken uygun şekilde PendingIntentHandler's retrieveProviderCreateCredentialRequest veya retrieveProviderGetCredentialRequest işlevini çağırın. Bu döndürülen nesneler, sağlayıcı için gereken meta verileri içerir. Ö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.authenticationError
        // Process the error
    }

    // Other logic...
}

Bu örnekte, biyometrik akışın başarısı hakkında bilgiler yer almaktadır. Ayrıca kimlik bilgisiyle ilgili diğer bilgileri de içerir. Akış başarısız olursa karar vermek için biometricPromptResult.authenticationError bölümündeki hata kodunu kullanın. biometricPromptResult.authenticationError.errorCode kapsamında döndürülen hata kodları, androidx.biometric kitaplığında tanımlanan hata kodlarıyla aynıdır. Örneğin, androidx.biometric.BiometricPrompt.NO_SPACE, androidx.biometric.BiometricPrompt.UNABLE_TO_PROCESS, androidx.biometric.BiometricPrompt.ERROR_TIMEOUT ve benzeri. authenticationError ayrıca bir 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ışınızın null olup olmadığını kontrol edin. Evetse kimlik doğrulamak için kendi biyometrinizi yapılandırın. Bu, get işleminin izlenmesine 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.authenticationError
    // Process the error
}

// Other logic...