تأیید اعتبار دیجیتال در برنامههای Android میتواند برای احراز هویت و تأیید هویت کاربر (مانند شناسه دولتی)، ویژگیهای مربوط به آن کاربر (مانند گواهینامه رانندگی، مدرک تحصیلی، یا ویژگیهایی مانند سن یا آدرس) یا سناریوهای دیگر استفاده شود. جایی که برای اثبات اصالت یک نهاد نیاز به صدور و تأیید اعتبار است.
Digital Credentials یک استاندارد عمومی انکوباتور W3C است که نحوه دسترسی به اعتبار دیجیتال قابل تأیید کاربر از یک کیف پول دیجیتال را مشخص می کند و برای موارد استفاده از وب با W3C Credential Management API پیاده سازی شده است. در اندروید، Credential Manager's DigitalCredential
API برای تأیید اعتبار دیجیتال استفاده می شود.
پیاده سازی
برای تأیید اعتبار دیجیتال در پروژه اندروید خود، موارد زیر را انجام دهید:
- وابستگی ها را به اسکریپت ساخت برنامه خود اضافه کنید و کلاس
CredentialManager
را مقداردهی اولیه کنید. - یک درخواست اعتبار دیجیتال بسازید و از آن برای مقداردهی اولیه
DigitalCredentialOption
و سپس ساختGetCredentialRequest
استفاده کنید. - جریان
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
دیالوگهای سیستم اندروید را برای ارائه گزینههای اعتبار در دسترس کاربر و جمعآوری انتخابهای او راهاندازی میکند. سپس، برنامه کیف پول که حاوی گزینه اعتبار انتخاب شده است، رابطهای کاربری را برای جمعآوری رضایت و انجام اقدامات لازم برای ایجاد پاسخ اعتبار دیجیتالی نمایش میدهد.
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}")
}
}