Проверка цифровых учетных данных

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

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

Выполнение

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

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

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

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

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

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

val credentialManager = CredentialManager.create(context)

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

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

// The request in the JSON format to conform with
// the JSON-ified Digital Credentials 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)
)

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

Запустите поток 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}")
    }
}