Menangani penerbitan kredensial dengan aplikasi pemegang Anda

Untuk menerima dan menyimpan kredensial dari penerbit, aplikasi pemegang Anda harus menangani alur penerbitan. Dalam alur penerbitan, situs atau aplikasi penerbit mengirimkan penawaran kredensial ke aplikasi pemegang yang menjelaskan informasi yang diperlukan untuk menyediakan kredensial. Aplikasi pemegang menggunakan RegistryManager untuk mendaftarkan jenis kredensial yang akan ditanganinya ke Credential Manager. Hal ini memungkinkan aplikasi ditampilkan dan dipilih oleh pengguna selama permintaan penerbitan untuk menerima kredensial.

Untuk mengetahui informasi selengkapnya tentang cara kerja kredensial dengan Holder API, baca artikel Konsep inti Holder API.

Kompatibilitas versi Android

Holder API didukung di Android 6 (level API 23) dan yang lebih tinggi.

Penerapan

Untuk menggunakan Credential Manager Holder API, tambahkan dependensi berikut ke skrip build modul aplikasi Anda:

Groovy

dependencies {
    // Use to implement credentials registrys

    implementation "androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-provider:1.0.0-alpha04"
    implementation "androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04"

}

Kotlin

dependencies {
    // Use to implement credentials registrys

    implementation("androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-provider:1.0.0-alpha04")
    implementation("androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04")

}

Buat RegistryManager

Buat instance RegistryManager dan daftarkan permintaan RegisterCreationOptionsRequest dengannya.

val registryManager = RegistryManager.create(context)

try {
    registryManager.registerCreationOptions(object :
        RegisterCreationOptionsRequest(
            creationOptions = buildIssuanceData(),
            matcher = loadIssuanceMatcher(),
            type = DigitalCredential.TYPE_DIGITAL_CREDENTIAL,
            id = "openid4vci",
        ) {}
    )
} catch (e: Exception) {
    Log.e(TAG, "Issuance registration failed.", e)
}

Pencocok adalah file biner WebAssembly (Wasm) yang akan menerima set creationOptions selama pendaftaran dan penawaran kredensial yang dikirim oleh penerbit untuk menentukan entri yang ditampilkan di UI Pengelola Kredensial. Lihat contoh aplikasi dompet open source untuk mengetahui contoh pencocokan.

Menangani permintaan penerbitan

Selanjutnya, dompet perlu menangani saat opsi pembuatan kredensial dipilih oleh pengguna. Tentukan aktivitas yang memproses filter intent androidx.credentials.registry.provider.action.CREATE_CREDENTIAL, seperti yang ditunjukkan dalam dompet contoh.

Intent yang meluncurkan aktivitas berisi permintaan pembuatan dan asal panggilan, yang dapat Anda ekstrak dengan fungsi PendingIntentHandler.retrieveProviderCreateCredentialRequest. API akan menampilkan ProviderCreateCredentialRequest yang berisi semua informasi yang terkait dengan permintaan pembuatan. Ada dua komponen utama:

  • Aplikasi yang membuat permintaan. Anda dapat mengambilnya dengan getCallingAppInfo.
  • Permintaan dari aplikasi yang memanggil. Anda dapat mengambilnya dengan getCallingRequest, yang menampilkan CreateCredentialRequest. Jika permintaan adalah untuk kredensial digital, permintaan tersebut adalah instance CreateDigitalCredentialRequest, yang berisi JSON permintaan penerbitan di properti requestJson. Anda dapat memprosesnya dengan contoh kode berikut:
val pendingIntentRequest =
    PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)
val request = pendingIntentRequest!!.callingRequest
if (request is CreateDigitalCredentialRequest) {
    Log.i(TAG, "Got DC creation request: ${request.requestJson}")
    processCreationRequest(request.requestJson)
}

Pengesahan kunci

Perhatikan hal-hal berikut tentang pengesahan kunci:

  • Saat membuat pengesahan kunci, Anda mungkin menggunakan BigInteger.toByteArray() untuk mengonversi materi kunci menjadi, misalnya, kunci web JSON. Metode ini terkadang menambahkan byte tanda dan menyebabkan error validasi. Jika hal ini terjadi, hapus byte ini sebelum mengirimkan pengesahan kunci ke penerbit.
  • Sebaiknya gunakan android_key_attestation sebagai jenis bukti kunci.

Menampilkan respons pembuatan

Setelah dompet menyelesaikan langkah-langkah yang diperlukan untuk menyimpan kredensial, selesaikan aktivitas dengan respons kredensial:

val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
    resultData,
    CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()

Jika ada pengecualian, Anda dapat mengirim pengecualian kredensial dengan cara yang sama:

val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
    resultData,
    CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()

Untuk melihat contoh lengkap cara menampilkan respons kredensial dalam konteks, lihat aplikasi contoh.