Проверка цифровых учетных данных в приложениях Android может использоваться для аутентификации и авторизации личности пользователя (например, удостоверения личности государственного образца), свойств этого пользователя (например, водительских прав, ученой степени или таких атрибутов, как возраст или адрес) или других сценариев, когда учетные данные должны быть выданы и проверены для подтверждения подлинности объекта.
Digital Credentials — это общедоступный стандарт W3C, определяющий, как получить доступ к проверяемым цифровым учётным данным пользователя из цифрового кошелька. Он реализован для веб-применения с помощью API управления учётными данными W3C . На устройствах Android для проверки цифровых учётных данных используется API DigitalCredential
от Credential Manager.
Выполнение
Чтобы проверить цифровые учетные данные в вашем проекте Android, выполните следующие действия:
- Добавьте зависимости в скрипт сборки вашего приложения и инициализируйте класс
CredentialManager
. - Создайте запрос на цифровые учетные данные и используйте его для инициализации
DigitalCredentialOption
, а затем создайтеGetCredentialRequest
. - Запустите поток
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}")
}
}