הגנה על תמונות פרטיות

רקע

התכונה 'תמונות פרטיות מאובטחות' מאפשרת להגדיר תמונות בכרטיסים שלא צריכות להיות נגישות מכתובת URL שפונה לציבור (דרישה לתמונות רגילות כדי להציג אותן בצורה תקינה בכרטיסים). משתמשים ב-Wallet API כדי להעלות תמונה ולקבל מזהה שאפשר להשתמש בו כדי להפנות לתמונה הזו באובייקט של כרטיס ב-Wallet.

אלה סוגי הכרטיסים הנתמכים:

  • כרטיס לאירוע
  • כרטיס עלייה למטוס
  • כרטיס לתחבורה ציבורית
  • כרטיס מבצע
  • כרטיס מתנה
  • כרטיס מועדון לקוחות
  • כרטיס גנרי

דוגמה לתכונה

דוגמה לתמונה פרטית מאובטחת
כרטיס חברות באמצעות תמונה פרטית מאובטחת

תרחישים לדוגמה

תמונות פרטיות מאובטחות מאפשרות להשתמש בתמונות שלא צריכות להיות זמינות לכולם, ולכן אפשר להשתמש בהן למטרות כמו תמונת פרופיל. האפשרות הזו שימושית במקרים מסוימים, למשל:

  • כרטיס מנוי שנתי
  • כרטיס ביקור
  • כרטיס לתחבורה ציבורית

הערה: תמונות פרטיות מאובטחות לא מיועדות לייצוג של כרטיסים כמסמכי זיהוי רשמיים, בהתאם להנחיות הנוספות שמפורטות במדיניות השימוש המקובל.

שיקולים לשימוש בתכונה Wallet

  • אי אפשר להשתמש בהם עם כרטיסים פרטיים כלליים
  • אפשר להוסיף אותם רק לאובייקטים של כרטיסים (לא למחלקות)
  • אפשר להשתמש רק באובייקט אחד
  • אפשר להשתמש בנכס הזה רק עם ImageModuleData (ולא עם תמונות אחרות, למשל לוגו ולוגו רחב של כותרת)

תכונות בפיתוח

  • תמיכה באינטרנט
  • תמונות פרטיות בתמונות ראשיות (Hero)

שלבי ההטמעה

  1. מעלים את התמונה הפרטית באמצעות Google Wallet API כדי לקבל privateImageId.
  2. מוסיפים תמונה לאובייקט הכרטיס (לדוגמה, ImageModuleData). במקום להגדיר את השדה sourceUri בתמונה, מגדירים את השדה privateImageId עם הערך שהתקבל מהשלב הקודם.

דיאגרמת רצף

דיאגרמה של רצף תמונות מאובטח
רצף תמונות פרטי מאובטח

קוד לדוגמה

העלאת התמונה

String issuerId = "12345";
String keyFilePath = "/path/to/key.json";
GoogleCredential credential =
    GoogleCredential.fromStream(new FileInputStream(keyFilePath))
        .createScoped(Arrays.asList("https://www.googleapis.com/auth/wallet_object.issuer"));
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

// Prepare request to upload image
String contentType = "image/jpeg";  // MIME type of image
String imageFilePath = "/path/to/image.jpg";
HttpContent content =
    new ByteArrayContent(
        contentType, ByteStreams.toByteArray(new FileInputStream(imageFilePath)));

String url =
    String.format(
        "https://walletobjects.googleapis.com/upload/walletobjects/v1/privateContent/%s/uploadPrivateImage",
        issuerId);

// Make request to upload image
HttpResponse response =
    httpTransport
        .createRequestFactory(credential)
        .buildPostRequest(new GenericUrl(url), content)
        .execute();

// Get privateImageId from response
Gson gson = new Gson();
JsonObject jsonObject = gson.fromJson(response.parseAsString(), JsonObject.class);
String privateImageId = jsonObject.get("privateImageId").getAsString();

שימוש בתמונה פרטית באובייקט הכרטיס

// Build GenericObject with privateImageId in ImageModuleData (also adding an optional TextModuleData)
Image image = new Image().setPrivateImageId(privateImageId);
ImageModuleData imageModuleData = new ImageModuleData().setId("imageId").setMainImage(image);
TextModuleData textModuleData =
    new TextModuleData().setId("textId").setHeader("Card holder").setBody("John Doe");
GenericObject genericObject =
    new GenericObject()
        .setId(issuerId + ".objectId")
        // class must be inserted before inserting object
        .setClassId(issuerId + ".classId")
        .setCardTitle("Business name")
        .setHeader("My membership card")
        .setImageModulesData(Arrays.asList(imageModuleData))
        .setTextModulesData(Arrays.asList(textModuleData));

// Insert GenericObject (or can use in JWT without inserting ahead of time)
Walletobjects service =
    new Walletobjects.Builder(httpTransport, GsonFactory.getDefaultInstance(), credential)
        .setApplicationName("My Application")
        .build();

service.genericobject().insert(genericObject).execute();

עדכון הכרטיס כדי שהתמונה תוצג בחזית

אפשר להשתמש בתמונה הפרטית המאובטחת בכל שדה נתונים של imageModules. הדוגמה הבאה ממחישה איך להשתמש בשדה imageModulesData כדי למקם את התמונה בחזית הכרטיס באמצעות שינוי ברירת המחדל של התבנית. דוגמה להוספת מחלקה באמצעות החלפה של תבנית:

CardTemplateOverride cardTemplateOverride =
    new CardTemplateOverride()
        .setCardRowTemplateInfos(
            Arrays.asList(
                new CardRowTemplateInfo()
                    .setTwoItems(
                        new CardRowTwoItems()
                            // The ids chosen here must be set on the object's TextModuleData and ImageModuleData
                            .setStartItem(
                                createTemplateItem("object.textModulesData['textId']"))
                            .setEndItem(
                                createTemplateItem("object.imageModulesData['imageId']")))));
GenericClass genericClass =
    new GenericClass()
        .setId(issuerId + ".classId")
        .setClassTemplateInfo(
            new ClassTemplateInfo().setCardTemplateOverride(cardTemplateOverride));

service.genericclass().insert(genericClass);


...


private static TemplateItem createTemplateItem(String fieldPath) {
  return new TemplateItem()
      .setFirstValue(
          new FieldSelector()
              .setFields(Arrays.asList(new FieldReference().setFieldPath(fieldPath))));
}

טיפול בחריגים

יכול להיות שיתרחשו שגיאות פוטנציאליות אם נעשה שימוש לא נכון ב-Wallet FeatureAPI, כולל:

Message סיבה
לתמונה לא יכולים להיות גם source_uri וגם private_image_id המנפיק ניסה להגדיר source_uri ו-private_image_id בתמונה אחת, וזה אסור
לא נמצאה תמונה פרטית עם המזהה %s עבור המנפיק %s הגדרת מזהה של תמונה פרטית שלא קיימת באובייקט
לא ניתן היה להוסיף תמונה פרטית עם המזהה %s עבור המנפיק %s לאובייקט %s כי היא כבר בשימוש באובייקט %s. אפשר להשתמש בתמונה פרטית רק עם אובייקט אחד. ניסיון להשתמש באותה תמונה פרטית ביותר מאובייקט אחד. כדי להשתמש באותה תמונה פרטית עם יותר מאובייקט אחד, צריך להעלות אותה מחדש ולקבל מזהה חדש של תמונה פרטית, שאפשר להשתמש בו עם האובייקט השני.