כדי לקבל ולאחסן פרטי כניסה מגורמים מנפיקים, אפליקציית המחזיק צריכה לטפל בתהליכי הנפקה. בתהליך הנפקת תעודה, האתר או האפליקציה של הגורם המנפיק שולחים הצעה לתעודה לאפליקציה של המחזיק, עם פירוט המידע שנדרש להקצאת תעודה. אפליקציית המחזיק משתמשת ב-RegistryManager כדי לרשום ב-Credential Manager את סוגי פרטי הכניסה שהיא מתכוונת לטפל בהם. כך האפליקציה תוצג למשתמש והוא יוכל לבחור אותה במהלך בקשת הנפקה כדי לקבל את האישורים.
במאמר מושגי הליבה של Holder API מוסבר איך פרטי הכניסה פועלים עם Holder API.
תאימות לגרסת Android
Holder API נתמך ב-Android 6 (רמת API 23) ומעלה.
הטמעה
כדי להשתמש ב-Credential Manager Holder API, מוסיפים את יחסי התלות הבאים לסקריפט ה-build של מודול האפליקציה:
Groovy
dependencies { // Use to implement credentials registrys implementation "androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04" implementation "androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04" implementation "androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04" implementation "androidx.credentials.registry:registry-provider:1.0.0-alpha04" implementation "androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04" }
Kotlin
dependencies { // Use to implement credentials registrys implementation("androidx.credentials.registry:registry-digitalcredentials-mdoc:1.0.0-alpha04") implementation("androidx.credentials.registry:registry-digitalcredentials-openid:1.0.0-alpha04") implementation("androidx.credentials.registry:registry-digitalcredentials-sdjwtvc:1.0.0-alpha04") implementation("androidx.credentials.registry:registry-provider:1.0.0-alpha04") implementation("androidx.credentials.registry:registry-provider-play-services:1.0.0-alpha04") }
יצירת RegistryManager
יוצרים מופע RegistryManager ורושמים בו בקשת RegisterCreationOptionsRequest.
val registryManager = RegistryManager.create(context)
try {
registryManager.registerCreationOptions(object :
RegisterCreationOptionsRequest(
creationOptions = buildIssuanceData(),
matcher = loadIssuanceMatcher(),
type = DigitalCredential.TYPE_DIGITAL_CREDENTIAL,
id = "openid4vci",
) {}
)
} catch (e: Exception) {
Log.e(TAG, "Issuance registration failed.", e)
}
התאמת המחרוזות היא קובץ בינארי של WebAssembly (Wasm) שיקבל את הערך creationOptions שהוגדר במהלך הרישום ואת הצעת האישורים שנשלחה על ידי הגורם המנפיק, כדי לקבוע את הרשומות שיוצגו בממשק המשתמש של Credential Manager. דוגמה להתאמה אפשר לראות באפליקציית הארנק בקוד פתוח.
טיפול בבקשה להנפקה
בשלב הבא, הארנק צריך לטפל במצב שבו המשתמש בוחר באפשרות ליצירת אמצעי תשלום. מגדירים פעילות שמקשיבה לandroidx.credentials.registry.provider.action.CREATE_CREDENTIAL מסנן Intent, כמו שמוסבר בארנק לדוגמה.
ה-Intent שמפעיל את הפעילות מכיל את בקשת היצירה ואת מקור הקריאה, שאפשר לחלץ באמצעות הפונקציה PendingIntentHandler.retrieveProviderCreateCredentialRequest. ה-API מחזיר ProviderCreateCredentialRequest שמכיל את כל המידע שמשויך לבקשת היצירה. יש שני רכיבים מרכזיים:
- האפליקציה ששלחה את הבקשה. אפשר לאחזר את הנתונים באמצעות
getCallingAppInfo. - הבקשה מאפליקציית השיחות. אפשר לאחזר אותה באמצעות
getCallingRequest, שמחזירהCreateCredentialRequest. אם הבקשה היא לקבלת פרטי כניסה דיגיטליים, היא מופע שלCreateDigitalCredentialRequest, שמכיל את בקשת ההנפקה ב-JSON במאפייןrequestJson. אפשר לעבד את הנתונים באמצעות הקוד לדוגמה הבא:
val pendingIntentRequest =
PendingIntentHandler.retrieveProviderCreateCredentialRequest(intent)
val request = pendingIntentRequest!!.callingRequest
if (request is CreateDigitalCredentialRequest) {
Log.i(TAG, "Got DC creation request: ${request.requestJson}")
processCreationRequest(request.requestJson)
}
החזרת התגובה ליצירה
אחרי שהארנק ישלים את השלבים שנדרשים לשמירת אמצעי הזיהוי, צריך להשלים את הפעילות עם התגובה של אמצעי הזיהוי:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialResponse(
resultData,
CreateDigitalCredentialResponse(response.responseJson)
)
setResult(RESULT_OK, resultData)
finish()
אם יש חריג, אפשר לשלוח את החריג לפרטי הכניסה באופן דומה:
val resultData = Intent()
PendingIntentHandler.setCreateCredentialException(
resultData,
CreateCredentialUnknownException() // Configure the proper exception
)
setResult(RESULT_OK, resultData)
finish()
כדי לראות דוגמה מלאה להחזרת תגובת האישורים בהקשר, אפשר לעיין באפליקציה לדוגמה.