يمكن استخدام عملية إثبات صحة بيانات الاعتماد الرقمية في تطبيقات Android لمصادقة هوية مستخدم (مثل مستند تعريف هوية صادر عن جهة حكومية) وتفويضه، أو إثبات صحة بيانات عن ذلك المستخدم (مثل رخصة قيادة أو درجة أكاديمية أو سمات مثل العمر أو العنوان)، أو في سيناريوهات أخرى يجب فيها إصدار بيانات اعتماد وإثبات صحتها لإثبات صحة هوية جهة معيّنة.
"معلومات الاعتماد الرقمية" هي معيار علني من W3C يحدّد كيفية الوصول إلى
معلومات الاعتماد الرقمية التي يمكن التحقّق منها الخاصة بالمستخدم من محفظة رقمية، ويتم تنفيذه
لحالات استخدام الويب باستخدام W3C Credential Management API. على
Android، يتم استخدام واجهة برمجة التطبيقات DigitalCredential
في Credential 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}")
}
}