Créer un connecteur d'identité

Par défaut, Google Cloud Search ne reconnaît que les identités Google stockées dans Annuaire Google Cloud (utilisateurs et groupes) Les connecteurs d'identité permettent de synchronisez les identités de votre entreprise avec les identités Google utilisées par Google Cloud Search.

Google propose les options suivantes pour développer des connecteurs d'identité:

  • SDK Identity Connector. Cette option est destinée aux développeurs en langage de programmation Java. Le SDK Identity Connector est un wrapper autour de l'API REST afin de créer rapidement des connecteurs. Pour créer un à l'aide du SDK, consultez Créez un connecteur d'identité à l'aide du SDK Identity Connector.

  • API REST de bas niveau et bibliothèques d'API. Ces options sont destinées aux développeurs Vous ne programmez peut-être pas en Java ou votre codebase est-il mieux adapté ou une bibliothèque. Pour créer un connecteur d'identité à l'aide de l'API REST, consultez à API Directory: Comptes utilisateur pour des informations sur le mappage des utilisateurs et la documentation Cloud Identity pour des informations sur le mappage de groupes.

Créer un connecteur d'identité à l'aide du SDK Identity Connector

Un connecteur d'identité standard exécute les tâches suivantes:

  1. Configurez le connecteur.
  2. Récupérez tous les utilisateurs du système d'identité de votre entreprise et envoyez-les vers Google pour la synchronisation avec les identités Google.
  3. Récupérez tous les groupes du système d'identité de votre entreprise et envoyez-les à Google pour la synchronisation avec les identités Google.

Configurer des dépendances

Vous devez inclure certaines dépendances dans votre fichier de compilation pour utiliser le SDK. Cliquez sur dans un onglet ci-dessous pour afficher les dépendances de votre environnement de compilation:

Maven

<dependency>
<groupId>com.google.enterprise.cloudsearch</groupId>
<artifactId>google-cloudsearch-identity-connector-sdk</artifactId>
<version>v1-0.0.3</version>
</dependency>

Gradle

 compile group: 'com.google.enterprise.cloudsearch',
         name: 'google-cloudsearch-identity-connector-sdk',
         version: 'v1-0.0.3'

Créer une configuration de connecteur

Chaque connecteur dispose d'un fichier de configuration contenant les paramètres utilisés par par exemple l'ID de votre dépôt. Les paramètres sont définis comme suit : des paires clé-valeur : api.sourceId=1234567890abcdef

Le SDK Google Cloud Search contient plusieurs configurations fournies par Google paramètres utilisés par tous les connecteurs. Vous devez déclarer les éléments suivants : Paramètres fournis par Google dans votre fichier de configuration:

  • Pour un connecteur de contenu, vous devez déclarer api.sourceId et api.serviceAccountPrivateKeyFile, car ces paramètres identifient l'emplacement de votre dépôt et la clé privée nécessaire pour y accéder.
  • Pour un connecteur d'identité, vous devez déclarer api.identitySourceId comme ceci identifie l'emplacement de votre source d'identité externe. Si vous utilisez les utilisateurs synchronisés, vous devez également déclarer api.customerId comme identifiant unique pour le compte Google Workspace de votre entreprise.

À moins que vous ne souhaitiez remplacer les valeurs par défaut des autres vous n'avez pas besoin de les déclarer dans votre fichier de configuration. Pour en savoir plus sur les paramètres de configuration fournis par Google, tels que comment générer certains ID et clés, reportez-vous Paramètres de configuration fournis par Google.

Vous pouvez également définir des paramètres spécifiques au dépôt à utiliser dans votre fichier de configuration.

Transmettre le fichier de configuration au connecteur

Définissez la propriété système config pour transmettre le fichier de configuration à votre le connecteur d'alimentation. Vous pouvez définir la propriété à l'aide de l'argument -D au démarrage le connecteur. Par exemple, la commande suivante permet de démarrer le connecteur avec le fichier de configuration MyConfig.properties:

java -classpath myconnector.jar;... -Dconfig=MyConfig.properties MyConnector

Si cet argument est manquant, le SDK tente d'accéder à une configuration par défaut nommé connector-config.properties.

Créer un connecteur d'identité de synchronisation complet à l'aide d'une classe de modèle

Le SDK Identity Connector contient une classe de modèle FullSyncIdentityConnector pour synchroniser tous les utilisateurs et groupes de l'identité avec les identités Google. Cette section explique comment utiliser les Modèle FullSyncIdentityConnector pour effectuer une synchronisation complète des utilisateurs et des groupes à partir d'une identité autre que Google un dépôt de clés.

Cette section fait référence aux extraits de code IdentityConnecorSample.java exemple. Dans cet exemple, on lit "User and group" les identités à partir de deux fichiers CSV et les synchronise avec les identités Google.

Implémenter le point d'entrée du connecteur

Le point d'entrée d'un connecteur est main(). La tâche principale de cette méthode est de créer une instance de Application et à appeler sa classe start() pour exécuter le connecteur.

Avant d'appeler application.start() utilisez la IdentityApplication.Builder pour instancier Modèle FullSyncIdentityConnector. Le FullSyncIdentityConnector accepte une Repository dont vous allez implémenter les méthodes. L'extrait de code suivant montre comment implémenter la méthode main():

IdentityConnectorSample.java
/**
 * This sample connector uses the Cloud Search SDK template class for a full
 * sync connector. In the full sync case, the repository is responsible
 * for providing a snapshot of the complete identity mappings and
 * group rosters. This is then reconciled against the current set
 * of mappings and groups in Cloud Directory.
 *
 * @param args program command line arguments
 * @throws InterruptedException thrown if an abort is issued during initialization
 */
public static void main(String[] args) throws InterruptedException {
  Repository repository = new CsvRepository();
  IdentityConnector connector = new FullSyncIdentityConnector(repository);
  IdentityApplication application = new IdentityApplication.Builder(connector, args).build();
  application.start();
}

En arrière-plan, le SDK appelle initConfig() après les appels de méthode main() du connecteur Application.build La méthode initConfig() effectue les tâches suivantes:

  1. Appelle la méthode Configuation.isInitialized() pour vous assurer que Configuration n'a pas été initialisé.
  2. Elle initialise un objet Configuration avec la clé-valeur fournie par Google. paires. Chaque paire clé-valeur est stockée ConfigValue dans l'objet Configuration.

Implémenter l'interface Repository

L'objet Repository n'a qu'une fonction, la synchronisation des identités du dépôt avec les identités Google. Lorsque vous utilisez un modèle, il vous suffit de remplacer certaines méthodes dans la Repository pour créer un connecteur d'identité. Pour le FullTraversalConnector , vous allez probablement remplacer les méthodes suivantes:

  • La init() . Pour configurer et initialiser un dépôt d'identités, remplacez la méthode init().

  • La listUsers() . Pour synchroniser tous les utilisateurs du dépôt d'identités avec les utilisateurs Google, remplacez la méthode listUsers().

  • La listGroups() . Pour synchroniser tous les groupes du dépôt d'identités avec Google Groupes, procédez comme suit : remplacez la méthode listGroups().

  • (Facultatif) La propriété close() . Si vous devez nettoyer le dépôt, remplacez close() . Cette méthode est appelée une fois lors de l'arrêt du connecteur.

Obtenir les paramètres de configuration personnalisés

Dans le cadre de la configuration de votre connecteur, vous devez obtenir des paramètres personnalisés Configuration . Cette tâche est généralement effectuée dans un Repository du cours init() .

La classe Configuration comporte plusieurs méthodes pour obtenir différents types de données. à partir d'une configuration. Chaque méthode renvoie un ConfigValue . Vous utiliserez ensuite l'objet ConfigValue get() pour récupérer la valeur réelle. L'extrait de code suivant montre comment récupérer userMappingCsvPath et Valeur groupMappingCsvPath à partir d'un objet Configuration:

IdentityConnectorSample.java
/**
 * Initializes the repository once the SDK is initialized.
 *
 * @param context Injected context, contains convenienve methods
 *                for building users & groups
 * @throws IOException if unable to initialize.
 */
@Override
public void init(RepositoryContext context) throws IOException {
  log.info("Initializing repository");
  this.context = context;
  userMappingCsvPath = Configuration.getString(
      "sample.usersFile", "users.csv").get().trim();
  groupMappingCsvPath = Configuration.getString(
      "sample.groupsFile", "groups.csv").get().trim();
}

Pour récupérer et analyser un paramètre contenant plusieurs valeurs, utilisez l'une des méthodes les analyseurs de type de la classe Configuration pour analyser les données en fragments distincts. L'extrait de code suivant, issu du connecteur du tutoriel, utilise la classe getMultiValue pour obtenir la liste des noms de dépôts GitHub:

GithubRepository.java
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

Obtenir le mappage pour tous les utilisateurs

Remplacement listUsers() pour récupérer le mappage de tous les utilisateurs à partir de votre dépôt d'identités. La La méthode listUsers() accepte un point de contrôle représentant la dernière identité à être synchronisées. Le point de contrôle peut être utilisé pour reprendre la synchronisation si le processus sans interruption. Pour chaque utilisateur de votre dépôt, vous effectuerez ces étapes dans la méthode listUsers():

  1. Obtenir un mappage composé de l'identité Google et des éléments externes associés l'identité.
  2. Empaquetez ces deux éléments dans un itérateur renvoyé par la méthode listUsers().

Obtenir un mappage d'utilisateurs

L'extrait de code suivant montre comment récupérer les mappages d'identité stockées dans un fichier CSV:

IdentityConnectorSample.java
/**
 * Retrieves all user identity mappings for the identity source. For the
 * full sync connector, the repository must provide a complete snapshot
 * of the mappings. This is reconciled against the current mappings
 * in Cloud Directory. All identity mappings returned here are
 * set in Cloud Directory. Any previously mapped users that are omitted
 * are unmapped.
 *
 * The connector does not create new users. All users are assumed to
 * exist in Cloud Directory.
 *
 * @param checkpoint Saved state if paging over large result sets. Not used
 *                   for this sample.
 * @return Iterator of user identity mappings
 * @throws IOException if unable to read user identity mappings
 */
@Override
public CheckpointCloseableIterable<IdentityUser> listUsers(byte[] checkpoint)
    throws IOException {
  List<IdentityUser> users = new ArrayList<>();
  try (Reader in = new FileReader(userMappingCsvPath)) {
    // Read user mappings from CSV file
    CSVParser parser = CSVFormat.RFC4180
        .withIgnoreSurroundingSpaces()
        .withIgnoreEmptyLines()
        .withCommentMarker('#')
        .parse(in);
    for (CSVRecord record : parser.getRecords()) {
      // Each record is in form: "primary_email", "external_id"
      String primaryEmailAddress = record.get(0);
      String externalId = record.get(1);
      if (primaryEmailAddress.isEmpty() || externalId.isEmpty()) {
        // Skip any malformed mappings
        continue;
      }
      log.info(() -> String.format("Adding user %s/%s",
          primaryEmailAddress, externalId));

      // Add the identity mapping
      IdentityUser user = context.buildIdentityUser(
          primaryEmailAddress, externalId);
      users.add(user);
    }
  }
  // ...
}

Empaqueter un mappage d'utilisateur dans un itérateur

listUsers() renvoie un Iterator, plus précisément CheckpointCloseableIterable de IdentityUser d'objets. Vous pouvez utiliser CheckpointClosableIterableImpl.Builder pour construire et renvoyer un itérateur. L'extrait de code suivant montre comment pour empaqueter chaque mappage dans l'itérateur de création de liste à partir de ce liste:

IdentityConnectorSample.java
CheckpointCloseableIterable<IdentityUser> iterator =
  new CheckpointCloseableIterableImpl.Builder<IdentityUser>(users)
      .setHasMore(false)
      .setCheckpoint((byte[])null)
      .build();

Obtenir un groupe

Remplacement listGroups() pour récupérer tous les groupes et leurs membres à partir de votre identité un dépôt de clés. La méthode listGroups() accepte un point de contrôle représentant le dernier à synchroniser. Le point de contrôle peut être utilisé pour reprendre la synchronisation si la sans interrompre le processus. Pour chaque utilisateur de votre dépôt, vous effectuerez ces étapes dans la méthode listGroups():

  1. Récupérez le groupe et ses membres.
  2. Empaqueter chaque groupe et ses membres dans un itérateur renvoyé par la listGroups().

Obtenir l'identité du groupe

L'extrait de code suivant montre comment récupérer les groupes et les membres stockées dans un fichier CSV:

IdentityConnectorSample.java
/**
 * Retrieves all group rosters for the identity source. For the
 * full sync connector, the repository must provide a complete snapshot
 * of the rosters. This is reconciled against the current rosters
 * in Cloud Directory. All groups and members  returned here are
 * set in Cloud Directory. Any previously created groups or members
 * that are omitted are removed.
 *
 * @param checkpoint Saved state if paging over large result sets. Not used
 *                   for this sample.
 * @return Iterator of group rosters
 * @throws IOException if unable to read groups
 */    @Override
public CheckpointCloseableIterable<IdentityGroup> listGroups(byte[] checkpoint)
    throws IOException {
  List<IdentityGroup> groups = new ArrayList<>();
  try (Reader in = new FileReader(groupMappingCsvPath)) {
    // Read group rosters from CSV
    CSVParser parser = CSVFormat.RFC4180
        .withIgnoreSurroundingSpaces()
        .withIgnoreEmptyLines()
        .withCommentMarker('#')
        .parse(in);
    for (CSVRecord record : parser.getRecords()) {
      // Each record is in form: "group_id", "member"[, ..., "memberN"]
      String groupName = record.get(0);
      log.info(() -> String.format("Adding group %s", groupName));
      // Parse the remaining columns as group memberships
      Supplier<Set<Membership>> members = new MembershipsSupplier(record);
      IdentityGroup group = context.buildIdentityGroup(groupName, members);
      groups.add(group);
    }
  }
  // ...

}

Empaqueter le groupe et ses membres dans un itérateur

listGroups() renvoie un Iterator, plus précisément CheckpointCloseableIterable de IdentityGroup d'objets. Vous pouvez utiliser CheckpointClosableIterableImpl.Builder pour construire et renvoyer un itérateur. L'extrait de code suivant montre comment pour regrouper chaque groupe et ses membres dans une liste, puis créer l'itérateur à partir de cette liste. liste:

IdentityConnectorSample.java
CheckpointCloseableIterable<IdentityGroup> iterator =
   new CheckpointCloseableIterableImpl.Builder<IdentityGroup>(groups)
      .setHasMore(false)
      .setCheckpoint((byte[])null)
      .build();

Étapes suivantes

Voici quelques étapes que vous pouvez également suivre :