Sécuriser les images privées

Arrière-plan

La fonctionnalité d'images privées sécurisées vous permet de définir des images sur les cartes qui n'ont pas besoin d'être accessibles à partir d'une URL publique (une exigence pour que les images standards s'affichent correctement sur les cartes). Vous utilisez l'API Wallet pour importer une image et recevoir un identifiant qui peut être utilisé pour faire référence à cette image sur un objet de carte Wallet.

Les types de pass suivants sont acceptés :

  • Billet pour un événement
  • Carte d'embarquement
  • Titre de transport
  • Carte d'offre
  • de publicité gratuite
  • Carte de fidélité
  • Carte générique

Exemple de fonctionnalité

Exemple d'image privée sécurisée
Carte de membre utilisant une image privée sécurisée

Cas d'utilisation

Les images privées sécurisées permettent d'utiliser des images qui n'ont pas besoin d'être accessibles au public et qui peuvent donc être utilisées pour des éléments tels qu'une photo de profil. Cela permet des cas d'utilisation tels que les suivants :

  • Pass annuel
  • Carte de visite
  • Titre de transport

Remarque : Les images privées sécurisées ne sont pas destinées à représenter des pass comme pièces d'identité officielles, conformément aux consignes supplémentaires définies dans le Règlement sur l'utilisation autorisée.

Éléments à prendre en compte lors de l'utilisation de la fonctionnalité Wallet

  • Ne peut pas être utilisé avec des pass privés génériques
  • Ne peut être ajouté qu'à des objets de pass (et non à des classes)
  • Ne peut être utilisé qu'avec un seul objet
  • Ne peut être utilisé qu'avec ImageModuleData (pas avec d'autres images, par exemple le logo et le logo d'en-tête large)

Fonctionnalités en cours de développement

  • Assistance Web
  • Images privées dans les images héros

Procédure d'intégration

  1. Importez votre image privée à l'aide de l'API Google Wallet pour recevoir un privateImageId.
  2. Ajoutez une image à l'objet pass (par exemple, ImageModuleData). Au lieu de définir le champ sourceUri sur l'image, vous définissez le champ privateImageId avec la valeur obtenue à l'étape précédente.

Diagramme de séquence

Diagramme de séquence d'image sécurisé
Sécuriser une séquence d'images privées

Exemple de code

Importer l'image

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();

Utiliser l'image privée sur l'objet pass

// 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();

Mettre à jour la carte pour afficher l'image au recto

Vous pouvez utiliser l'image privée sécurisée dans n'importe quel champ imageModulesData. Voici un exemple d'utilisation d'un champ imageModulesData pour positionner l'image au recto de la carte à l'aide d'un remplacement de modèle. Voici un exemple d'insertion d'une classe avec un remplacement de modèle :

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))));
}

Gestion des exceptions

Des erreurs peuvent se produire en cas d'utilisation incorrecte de l'API Wallet Feature. En voici quelques exemples :

Message Motif
L'image ne peut pas avoir à la fois source_uri et private_image_id. L'émetteur a essayé de définir un source_uri et un private_image_id sur une seule image, ce qui n'est pas autorisé.
Impossible de trouver l'image privée avec l'ID %s pour l'émetteur %s Définir un ID d'image privée inexistant sur un objet
Impossible d'ajouter l'image privée avec l'ID %s pour l'émetteur %s à l'objet %s, car elle est déjà utilisée avec l'objet %s. Une image privée ne peut être utilisée qu'avec un seul objet. Tentative d'utilisation de la même image privée sur plusieurs objets. Pour utiliser la même image privée avec plusieurs objets, vous devez la réimporter. Vous obtiendrez alors un nouvel ID d'image privée, qui pourra être utilisé avec le deuxième objet.