Utwórz łącznik tożsamości

Domyślnie Google Cloud Search rozpoznaje tylko tożsamości Google przechowywane w katalogu Google Cloud (użytkowników i grupy). Łączniki tożsamości służą do synchronizowania tożsamości przedsiębiorstwa z tożsamościami Google używanymi przez Google Cloud Search.

Google udostępnia te opcje tworzenia łączników tożsamości:

  • Pakiet SDK łącznika tożsamości. Ta opcja jest przeznaczona dla programistów, którzy programują w języku Java. Pakiet SDK oprogramowania sprzęgającego tożsamości to otoczka interfejsu API REST, która umożliwia szybkie tworzenie oprogramowania sprzęgającego. Aby utworzyć łącznik tożsamości za pomocą pakietu SDK, zapoznaj się z artykułem Tworzenie łącznika tożsamości za pomocą pakietu SDK łącznika tożsamości.

  • interfejs API REST niskiego poziomu i biblioteki interfejsów API. Te opcje są przeznaczone dla programistów, którzy nie programują w języku Java lub których baza kodu lepiej obsługuje interfejs API REST lub bibliotekę. Aby utworzyć oprogramowanie sprzęgające tożsamości za pomocą interfejsu REST API, zapoznaj się z informacjami o mapowaniu użytkowników w Directory API: User Accounts oraz z informacjami o mapowaniu grup w dokumentacji Cloud Identity.

Tworzenie oprogramowania sprzęgającego tożsamości za pomocą pakietu SDK oprogramowania sprzęgającego tożsamości

Typowy łącznik tożsamości wykonuje te zadania:

  1. Skonfiguruj oprogramowanie sprzęgające.
  2. Pobierz wszystkich użytkowników z systemu tożsamości przedsiębiorstwa i wyślij ich do Google w celu zsynchronizowania z tożsamościami Google.
  3. Pobierz wszystkie grupy z systemu tożsamości przedsiębiorstwa i wyślij je do Google w celu synchronizacji z tożsamościami Google.

Konfigurowanie zależności

Aby korzystać z pakietu SDK, musisz uwzględnić w pliku kompilacji określone zależności. Kliknij kartę poniżej, aby wyświetlić zależności dla środowiska kompilacji:

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'

Tworzenie konfiguracji oprogramowania sprzęgającego

Każdy łącznik ma plik konfiguracyjny zawierający parametry używane przez łącznik, takie jak identyfikator repozytorium. Parametry są zdefiniowane jako pary klucz-wartość, np.api.sourceId=1234567890abcdef.

Pakiet SDK Google Cloud Search zawiera kilka dostarczonych przez Google parametrów konfiguracji, które są używane przez wszystkie oprogramowania sprzęgające. W pliku konfiguracyjnym musisz zadeklarować te parametry dostarczone przez Google:

  • W przypadku łącznika treści musisz zadeklarować parametry api.sourceIdapi.serviceAccountPrivateKeyFile, ponieważ identyfikują one lokalizację repozytorium i klucza prywatnego potrzebnego do uzyskania dostępu do repozytorium.
  • W przypadku łącznika tożsamości musisz zadeklarować api.identitySourceId, ponieważ ten parametr określa lokalizację zewnętrznego źródła tożsamości. Jeśli synchronizujesz użytkowników, musisz też zadeklarować api.customerId jako unikalny identyfikator konta Google Workspace Twojej firmy.

Jeśli nie chcesz zastępować domyślnych wartości innych parametrów dostarczonych przez Google, nie musisz deklarować ich w pliku konfiguracyjnym. Więcej informacji o parametrach konfiguracyjnych dostarczanych przez Google, np. o tym, jak generować określone identyfikatory i klucze, znajdziesz w artykule Parametry konfiguracyjne dostarczane przez Google.

Możesz też zdefiniować własne parametry specyficzne dla repozytorium, które będą używane w pliku konfiguracyjnym.

Przekazywanie pliku konfiguracji do oprogramowania sprzęgającego

Ustaw właściwość systemową config, aby przekazać plik konfiguracji do łącznika. Usługę możesz ustawić za pomocą argumentu -D podczas uruchamiania złącza. Na przykład to polecenie uruchamia łącznik z plikiem konfiguracyjnym MyConfig.properties:

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

Jeśli tego argumentu brakuje, pakiet SDK próbuje uzyskać dostęp do domyślnego pliku konfiguracyjnego o nazwie connector-config.properties.

Tworzenie łącznika tożsamości pełnej synchronizacji za pomocą klasy szablonu

Pakiet SDK łącznika tożsamości zawiera FullSyncIdentityConnector klasę szablonu, której możesz użyć do synchronizowania wszystkich użytkowników i grup z repozytorium tożsamości z tożsamościami Google. W tej sekcji wyjaśniamy, jak za pomocą szablonuFullSyncIdentityConnector przeprowadzić pełną synchronizację użytkowników i grup z repozytorium tożsamości innego niż Google.

Ta sekcja dokumentacji odnosi się do fragmentów kodu z IdentityConnecorSample.java przykładu. Ten przykład odczytuje tożsamości użytkowników i grup z 2 plików CSV i synchronizuje je z tożsamościami Google.

Wdrażanie punktu wejścia oprogramowania sprzęgającego

Punktem wejścia do łącznika jest metoda main(). Głównym zadaniem tej metody jest utworzenie instancji klasy Application i wywołanie jej metody start() w celu uruchomienia oprogramowania sprzęgającego.

Przed wywołaniem funkcji application.start() użyj klasy IdentityApplication.Builder do utworzenia instancji szablonu FullSyncIdentityConnector. Metoda FullSyncIdentityConnector przyjmuje obiekt Repository, którego metody będziesz implementować. Poniższy fragment kodu pokazuje, jak wdrożyć metodę 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();
}

W tle pakiet SDK wywołuje metodę initConfig() po wywołaniu przez metodę main() łącznika metody Application.build. Metoda initConfig() wykonuje te zadania:

  1. Wywołuje metodę Configuation.isInitialized(), aby upewnić się, że zmienna Configuration nie została zainicjowana.
  2. Inicjuje obiekt Configuration za pomocą par klucz-wartość dostarczonych przez Google. Każda para klucz-wartość jest przechowywana w obiekcie ConfigValue w obiekcie Configuration.

Zaimplementuj interfejs Repository.

Jedynym celem obiektu Repository jest synchronizacja tożsamości repozytorium z tożsamościami Google. Jeśli używasz szablonu, wystarczy zastąpić niektóre metody w interfejsie Repository, aby utworzyć łącznik tożsamości. W przypadku FullTraversalConnector prawdopodobnie zastąpisz te metody:

  • Metoda init(). Aby przeprowadzić konfigurację i inicjalizację repozytorium tożsamości, zastąp metodę `init()`.

  • Metoda listUsers(). Aby zsynchronizować wszystkich użytkowników w repozytorium tożsamości z użytkownikami Google, zastąp metodę listUsers().

  • Metoda listGroups(). Aby zsynchronizować wszystkie grupy w repozytorium tożsamości z Grupami Google, zastąp metodę listGroups().

  • (opcjonalnie) Metoda close(). Jeśli musisz wyczyścić repozytorium, zastąp metodę close(). Ta metoda jest wywoływana raz podczas zamykania oprogramowania sprzęgającego.

Pobieranie parametrów konfiguracji niestandardowej

W ramach obsługi konfiguracji konektora musisz pobrać wszystkie parametry niestandardowe z obiektu Configuration. To zadanie jest zwykle wykonywane w metodzie init() klasy Repository.

Klasa Configuration ma kilka metod pobierania z konfiguracji różnych typów danych. Każda metoda zwraca obiekt ConfigValue. Następnie użyj metody ConfigValue obiektu get() do pobrania rzeczywistej wartości. Ten fragment kodu pokazuje, jak pobrać wartość userMappingCsvPathgroupMappingCsvPath z obiektu 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();
}

Aby pobrać i przeanalizować parametr zawierający kilka wartości, użyj jednego z parserów typów klasy Configuration, aby podzielić dane na odrębne części. Poniższy fragment kodu z konektora samouczka używa metody getMultiValue do pobrania listy nazw repozytoriów GitHub:

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

Pobieranie mapowania dla wszystkich użytkowników

Zastąp listUsers() aby pobrać mapowanie wszystkich użytkowników z repozytorium tożsamości. Metoda listUsers() akceptuje punkt kontrolny reprezentujący ostatnią tożsamość, która ma zostać zsynchronizowana. Punkt kontrolny może służyć do wznowienia synchronizacji w przypadku przerwania procesu. W przypadku każdego użytkownika w repozytorium wykonasz te czynności w metodzie listUsers():

  1. Uzyskaj mapowanie składające się z tożsamości Google i powiązanej z nią tożsamości zewnętrznej.
  2. Zapakuj parę w iterator zwrócony przez metodę listUsers().

Pobieranie mapowania użytkownika

Poniższy fragment kodu pokazuje, jak pobrać mapowania tożsamości przechowywane w pliku 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);
    }
  }
  // ...
}

Spakuj mapowanie użytkowników do iteratora

Metoda listUsers() zwraca obiekt Iterator, a konkretnie obiekt CheckpointCloseableIterable zawierający obiekty IdentityUser. Możesz użyć klasy CheckpointClosableIterableImpl.Builder do utworzenia i zwrócenia iteratora. Poniższy fragment kodu pokazuje, jak spakować każde mapowanie do listy i utworzyć z niej iterator:

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

Pobieranie grupy

Zastąp listGroups() aby pobrać wszystkie grupy i ich członków z repozytorium tożsamości. Metoda listGroups() akceptuje punkt kontrolny reprezentujący ostatnią tożsamość do zsynchronizowania. Punkt kontrolny może służyć do wznowienia synchronizacji w przypadku przerwania procesu. W przypadku każdego użytkownika w repozytorium wykonasz te czynności w metodzie listGroups():

  1. Pobierz grupę i jej członków.
  2. Zapakuj każdą grupę i jej członków w iterator zwrócony przez metodę listGroups().

Pobieranie tożsamości grupy

Poniższy fragment kodu pokazuje, jak pobrać grupy i członków zapisanych w pliku 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);
    }
  }
  // ...

}

Spakuj grupę i jej członków w iteratorze.

Metoda listGroups() zwraca obiekt Iterator, a konkretnie obiekt CheckpointCloseableIterable zawierający obiekty IdentityGroup. Możesz użyć klasy CheckpointClosableIterableImpl.Builder do utworzenia i zwrócenia iteratora. Poniższy fragment kodu pokazuje, jak spakować każdą grupę i jej członków na listę i utworzyć z niej iterator:

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

Następne kroki

Oto kilka kolejnych kroków, które możesz podjąć: