Диспетчер учетных данных – API-интерфейс проверки

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

Digital Credentials — это общедоступный стандарт W3C, определяющий способ доступа к проверяемым цифровым учетным данным пользователя из цифрового кошелька. Для веб-приложений он реализован с помощью API управления учетными данными W3C . На Android для проверки цифровых учетных данных используется API DigitalCredential из Credential Manager.

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

API Verifier поддерживается на Android 9 (уровень API 28) и выше.

Выполнение

Для проверки цифровых учетных данных в вашем проекте Android выполните следующие действия:

  1. Добавьте зависимости в скрипт сборки вашего приложения и инициализируйте класс CredentialManager .
  2. Создайте запрос на получение цифровых учетных данных и используйте его для инициализации объекта DigitalCredentialOption , после чего сформируйте запрос GetCredentialRequest .
  3. Запустите поток getCredential с помощью сформированного запроса, чтобы получить успешный ответ GetCredentialResponse или обработать любые возникающие исключения. После успешного получения данных проверьте правильность ответа.

Добавьте зависимости и инициализируйте.

Добавьте следующие зависимости в ваш скрипт сборки Gradle:

dependencies {
    implementation("androidx.credentials:credentials:1.6.0-beta01")
    implementation("androidx.credentials:credentials-play-services-auth:1.6.0-beta01")
}

Далее инициализируйте экземпляр класса CredentialManager .

val credentialManager = CredentialManager.create(context)

Сформируйте запрос на получение цифровых учетных данных.

Создайте запрос на получение цифровых учетных данных и используйте его для инициализации параметра DigitalCredentialOption .

// The request in the JSON format to conform with
// the JSON-ified Credential Manager - Verifier API request definition.
val requestJson = generateRequestFromServer()
val digitalCredentialOption =
    GetDigitalCredentialOption(requestJson = requestJson)

// Use the option from the previous step to build the `GetCredentialRequest`.
val getCredRequest = GetCredentialRequest(
    listOf(digitalCredentialOption)
)

Вот пример запроса OpenId4Vp. Полную справочную информацию можно найти на этом сайте .

{
  "requests": [
    {
      "protocol": "openid4vp-v1-unsigned",
      "data": {
        "response_type": "vp_token",
        "response_mode": "dc_api",
        "nonce": "OD8eP8BYfr0zyhgq4QCVEGN3m7C1Ht_No9H5fG5KJFk",
        "dcql_query": {
          "credentials": [
            {
              "id": "cred1",
              "format": "mso_mdoc",
              "meta": {
                "doctype_value": "org.iso.18013.5.1.mDL"
              },
              "claims": [
                {
                  "path": [
                    "org.iso.18013.5.1",
                    "family_name"
                  ]
                },
                {
                  "path": [
                    "org.iso.18013.5.1",
                    "given_name"
                  ]
                },
                {
                  "path": [
                    "org.iso.18013.5.1",
                    "age_over_21"
                  ]
                }
              ]
            }
          ]
        }
      }
    }
  ]
}

Получите учетные данные

Запустите поток getCredential с помощью сформированного запроса. Вы получите либо успешный GetCredentialResponse , либо исключение GetCredentialException если запрос не удастся.

Процесс getCredential запускает диалоговые окна системы Android, отображающие доступные пользователю варианты учетных данных и собирающие информацию о его выборе. Затем приложение-кошелек, содержащее выбранный вариант учетных данных, отображает интерфейсы для сбора согласия и выполнения действий, необходимых для генерации ответа с цифровыми учетными данными.

coroutineScope.launch {
    try {
        val result = credentialManager.getCredential(
            context = activityContext,
            request = getCredRequest
        )
        verifyResult(result)
    } catch (e : GetCredentialException) {
        handleFailure(e)
    }
}

// Handle the successfully returned credential.
fun verifyResult(result: GetCredentialResponse) {
    val credential = result.credential
    when (credential) {
        is DigitalCredential -> {
            val responseJson = credential.credentialJson
            validateResponseOnServer(responseJson)
        }
        else -> {
            // Catch any unrecognized credential type here.
            Log.e(TAG, "Unexpected type of credential ${credential.type}")
        }
    }
}

// Handle failure.
fun handleFailure(e: GetCredentialException) {
  when (e) {
        is GetCredentialCancellationException -> {
            // The user intentionally canceled the operation and chose not
            // to share the credential.
        }
        is GetCredentialInterruptedException -> {
            // Retry-able error. Consider retrying the call.
        }
        is NoCredentialException -> {
            // No credential was available.
        }
        is CreateCredentialUnknownException -> {
            // An unknown, usually unexpected, error has occurred. Check the
            // message error for any additional debugging information.
        }
        is CreateCredentialCustomException -> {
            // You have encountered a custom error thrown by the wallet.
            // If you made the API call with a request object that's a
            // subclass of CreateCustomCredentialRequest using a 3rd-party SDK,
            // then you should check for any custom exception type constants
            // within that SDK to match with e.type. Otherwise, drop or log the
            // exception.
        }
        else -> Log.w(TAG, "Unexpected exception type ${e::class.java}")
    }
}