Aby otrzymywać i przechowywać dane logowania od wydawców, aplikacja portfela musi obsługiwać procesy wydawania. W procesie wydawania witryna lub aplikacja wydawcy wysyła do aplikacji portfela ofertę danych logowania, która zawiera informacje potrzebne do udostępnienia danych logowania. Aplikacja portfela używa RegistryManager do zarejestrowania w Credential Manager typów danych logowania, które ma obsługiwać. Dzięki temu aplikacja może być wyświetlana i wybierana przez użytkownika podczas żądania wydania danych logowania.
Więcej informacji o tym, jak dane logowania działają z Holder API, znajdziesz w artykule Podstawowe pojęcia Holder API.
Zgodność z wersjami Androida
Holder API jest obsługiwany na Androidzie 6 (poziom interfejsu API 23) i nowszych wersjach.
Implementacja
Aby korzystać z Holder API Menedżera danych logowania, 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 żądanie 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)
}
Dopasowywacz to plik binarny WebAssembly (Wasm), który będzie otrzymywać creationOptions ustawione podczas rejestracji oraz ofertę danych logowania wysłaną przez wydawcę, aby określić wpisy wyświetlane w interfejsie Menedżera danych logowania. Przykład dopasowywacza znajdziesz w
przykładowej aplikacji portfela typu open source.
Obsługa żądania wydania danych logowania
Następnie portfel musi obsługiwać sytuację, gdy użytkownik wybierze opcję utworzenia danych logowania. Zdefiniuj aktywność, która nasłuchuje filtra intencji
androidx.credentials.registry.provider.action.CREATE_CREDENTIAL,
jak pokazano w przykładowym portfelu.
Intencja, która uruchamia aktywność, zawiera żądanie utworzenia i źródło wywołania, które można wyodrębnić za pomocą funkcji PendingIntentHandler.retrieveProviderCreateCredentialRequest. Interfejs API zwraca ProviderCreateCredentialRequest zawierający wszystkie informacje powiązane z żądaniem utworzenia. Istnieją 2 kluczowe komponenty:
- Aplikacja, która wysłała żądanie. Możesz ją pobrać za pomocą
getCallingAppInfo. - Żądanie z aplikacji wywołującej. Możesz je pobrać za pomocą
getCallingRequest, która zwracaCreateCredentialRequest. Jeśli żądanie dotyczy cyfrowych danych logowania, jest to instancjaCreateDigitalCredentialRequest, która zawiera żądanie wydania w formacie JSON w właściwościrequestJson. Możesz je przetworzyć 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)
}
Atestacja klucza
Oto kilka informacji o atestacji klucza:
- Podczas generowania atestacji klucza możesz używać
BigInteger.toByteArray()do konwertowania materiałów klucza na przykład na klucz internetowy JSON. Ta metoda może czasami dodać bajt znaku i spowodować błąd weryfikacji. Jeśli tak się stanie, usuń te bajty przed wysłaniem atestacji klucza do wydawcy. - Zalecamy używanie
android_key_attestationjako typu dowodu klucza.
Wysyłanie odpowiedzi na żądanie utworzenia
Gdy portfel wykona czynności potrzebne do zapisania danych logowania, zakończ aktywność za pomocą odpowiedzi danych logowania:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
resultData,
CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()
Jeśli wystąpi wyjątek, możesz podobnie wysłać wyjątek danych logowania:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
resultData,
CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()
Pełny przykład zwracania odpowiedzi danych logowania w kontekście znajdziesz w przykładowej aplikacji.