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 instancjaCreateDigitalCredentialRequest, która zawiera żądanie wydania w formacie JSON we właściwościrequestJson. 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.