Проверка цифровых учетных данных в приложениях Android может использоваться для аутентификации и авторизации личности пользователя (например, государственного удостоверения личности), свойств этого пользователя (например, водительских прав, ученой степени или таких атрибутов, как возраст или адрес) или других сценариев, когда учетные данные необходимо выдать и проверить, чтобы подтвердить подлинность объекта.
Цифровые учетные данные — это общедоступный стандарт W3C, который определяет, как получить доступ к проверяемым цифровым учетным данным пользователя из цифрового кошелька и реализован для случаев веб-использования с помощью W3C Credential Management API . В Android для проверки цифровых учетных данных используется API DigitalCredential
Manager.
Выполнение
Чтобы проверить цифровые учетные данные в вашем проекте Android, выполните следующие действия:
- Добавьте зависимости в сценарий сборки вашего приложения и инициализируйте класс
CredentialManager
. - Создайте запрос цифровых учетных данных и используйте его для инициализации
DigitalCredentialOption
с последующим созданиемGetCredentialRequest
. - Запустите поток
getCredential
с созданным запросом, чтобы получить успешныйGetCredentialResponse
или обработать любые исключения, которые могут возникнуть. После успешного получения подтвердите ответ.
Добавьте зависимости и инициализируйте
Добавьте следующие зависимости в скрипт сборки Gradle:
dependencies {
implementation("androidx.credentials:credentials:")
implementation("androidx.credentials:credentials-play-services-auth:")
}
Затем инициализируйте экземпляр класса 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)
)
Вот пример запроса OpenId4Vp. Полную ссылку можно найти на этом сайте .
{
"digital": {
"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}")
}
}