Осуществляйте выдачу учетных данных с помощью приложения, принадлежащего вашему владельцу.

Для получения и хранения учетных данных от эмитентов вашему приложению-держателю необходимо обрабатывать потоки выдачи. В потоке выдачи веб-сайт или приложение эмитента отправляет приложению-держателю предложение об учетных данных, содержащее подробную информацию, необходимую для предоставления учетных данных. Приложение-держатель использует RegistryManager для регистрации в Credential Manager типов учетных данных, которые оно намерено обрабатывать. Это позволяет пользователю отображать и выбирать приложение во время запроса на выдачу учетных данных.

Для получения более подробной информации о том, как учетные данные работают с Holder API, ознакомьтесь с основными концепциями Holder API .

совместимость с версиями Android

API Holder поддерживается на Android 6 (уровень API 23) и выше.

Выполнение

Для использования API Credential Manager Holder добавьте следующие зависимости в скрипт сборки вашего модуля приложения:

классный

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"

}

Котлин

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

}

Создайте RegistryManager

Создайте экземпляр RegistryManager и зарегистрируйте в нем запрос 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)
}

Сопоставитель представляет собой исполняемый файл WebAssembly (Wasm), который получает параметры creationOptions установленные во время регистрации, и предложение учетных данных, отправленное эмитентом, для определения записей, отображаемых в пользовательском интерфейсе менеджера учетных данных. Пример работы сопоставителя можно найти в примере приложения-кошелька с открытым исходным кодом.

Обработка запроса на выдачу

Далее, кошелек должен обрабатывать выбор пользователем варианта создания учетных данных. Определите активность, которая будет отслеживать фильтр намерения androidx.credentials.registry.provider.action.CREATE_CREDENTIAL , как показано в примере кошелька .

Интент, запускающий активность, содержит запрос на создание и вызывающий источник, которые можно извлечь с помощью функции PendingIntentHandler.retrieveProviderCreateCredentialRequest . API возвращает объект ProviderCreateCredentialRequest , содержащий всю информацию, связанную с запросом на создание. Есть два ключевых компонента:

  • Приложение, отправившее запрос. Эту информацию можно получить с помощью getCallingAppInfo .
  • Запрос от вызывающего приложения. Вы можете получить его с помощью getCallingRequest , который возвращает объект CreateCredentialRequest . Если запрос касается цифровых учетных данных, это экземпляр CreateDigitalCredentialRequest , содержащий JSON-данные запроса на выдачу в свойстве requestJson . Вы можете обработать это с помощью следующего примера кода:
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)
}

Возвращает ответ о создании

После того, как кошелек завершит необходимые шаги для сохранения учетных данных, завершите операцию, отправив ответ с учетными данными:

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

В случае возникновения исключения вы можете аналогичным образом отправить запрос на отправку данных с исключением:

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

Чтобы увидеть полный пример возврата ответа с учетными данными в контексте, см. пример приложения .