Obsługa wydawania danych logowania za pomocą aplikacji portfela

Aby otrzymywać i przechowywać dane logowania od wystawców, aplikacja portfel musi obsługiwać procesy wydawania. W procesie wydawania witryna lub aplikacja wydawcy wysyła do aplikacji posiadacza ofertę poświadczenia zawierającą szczegółowe informacje potrzebne do udostępnienia poświadczenia. Aplikacja przechowująca używa interfejsu RegistryManager do rejestrowania w Credential Manager typów danych logowania, które ma obsługiwać. Umożliwia to wyświetlanie aplikacji użytkownikowi i wybieranie jej przez niego podczas prośby o wydanie certyfikatu.

Więcej informacji o tym, jak dane logowania działają w przypadku interfejsu Holder API, znajdziesz w artykule Najważniejsze pojęcia dotyczące interfejsu Holder API.

Zgodność z wersją Androida

Interfejs Holder API jest obsługiwany na Androidzie 6 (poziom interfejsu API 23) i nowszych wersjach.

Implementacja

Aby korzystać z interfejsu Credential Manager Holder API, dodaj te zależności do skryptu kompilacji modułu aplikacji:

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")

}

Tworzenie obiektu RegistryManager

Utwórz instancję RegistryManager i zarejestruj w niej prośbę RegisterCreationOptionsRequest.

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

Moduł dopasowujący to plik binarny WebAssembly (Wasm), który otrzyma creationOptions ustawiony podczas rejestracji oraz ofertę danych logowania wysłaną przez wystawcę, aby określić wpisy wyświetlane w interfejsie Menedżera danych logowania. Przykład dopasowania znajdziesz w przykładzie aplikacji portfela open source.

Obsługa prośby o wydanie

Następnie portfel musi obsługiwać sytuację, w której użytkownik wybierze opcję tworzenia danych logowania. Zdefiniuj aktywność, która nasłuchuje filtra intencjiandroidx.credentials.registry.provider.action.CREATE_CREDENTIAL, jak pokazano w przykładowym portfelu.

Intencja, która uruchamia aktywność, zawiera żądanie utworzenia i miejsce wywołania, które możesz wyodrębnić za pomocą funkcji PendingIntentHandler.retrieveProviderCreateCredentialRequest. Interfejs API zwraca ProviderCreateCredentialRequest zawierający wszystkie informacje związane z żądaniem utworzenia. Składają się na nią 2 kluczowe komponenty:

  • Aplikacja, która przesłała żądanie. Możesz to zrobić za pomocą getCallingAppInfo.
  • Żądanie z aplikacji do dzwonienia. Możesz je pobrać za pomocą funkcji getCallingRequest, która zwraca wartość CreateCredentialRequest. Jeśli żądanie dotyczy cyfrowych danych logowania, jest to instancja CreateDigitalCredentialRequest, która zawiera żądanie wydania w formacie JSON we właściwości requestJson. Możesz to zrobić za pomocą tego przykładowego kodu:
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)
}

Zwracanie odpowiedzi dotyczącej tworzenia

Gdy portfel wykona czynności potrzebne do zapisania danych logowania, zakończ działanie z odpowiedzią dotyczącą danych logowania:

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

Jeśli występuje wyjątek, możesz w podobny sposób przesłać wyjątek dotyczący danych logowania:

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

Pełny przykład zwracania odpowiedzi dotyczącej danych logowania w kontekście znajdziesz w przykładowej aplikacji.