Utwórz łącznik tożsamości

Domyślnie Google Cloud Search rozpoznaje tylko tożsamości Google w katalogu Google Cloud. Użyj łączników tożsamości, aby zsynchronizować tożsamości firmowe z tożsamościami Google, których używa Cloud Search.

Google udostępnia te opcje tworzenia oprogramowania sprzęgającego tożsamość:

  • Pakiet SDK Identity Connector: najlepszy dla programistów Java. Pakiet SDK to otoka interfejsu API REST, która umożliwia szybkie tworzenie oprogramowania sprzęgającego. Aby użyć pakietu SDK, zapoznaj się z artykułem Tworzenie łącznika tożsamości za pomocą pakietu SDK łącznika tożsamości.

  • Interfejs REST API niskiego poziomu i biblioteki API: najlepsze rozwiązanie dla programistów, którzy nie używają języka Java. Aby utworzyć oprogramowanie sprzęgające tożsamości za pomocą interfejsu API REST, zapoznaj się z artykułem Directory API: User Accounts, w którym znajdziesz informacje o mapowaniu użytkowników, oraz z dokumentacją Google Cloud Identity, w której znajdziesz informacje o mapowaniu grup.

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. Konfiguruje oprogramowanie sprzęgające.
  2. Pobiera użytkowników z systemu tożsamości i wysyła ich do Google.
  3. Pobiera grupy z systemu tożsamości i wysyła je do Google.

Konfigurowanie zależności

Uwzględnij te zależności w pliku 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żde oprogramowanie sprzęgające używa pliku konfiguracji do określania parametrów, takich jak identyfikator repozytorium. Zdefiniuj parametry jako pary klucz-wartość, np. api.sourceId=1234567890abcdef.

Pakiet Google Cloud Search SDK zawiera parametry dostarczone przez Google dla wszystkich łączników. W pliku konfiguracyjnym musisz zadeklarować te elementy:

  • Łącznik treści: zadeklaruj api.sourceId i api.serviceAccountPrivateKeyFile. Określają one Twoje repozytorium i klucz prywatny potrzebny do uzyskania dostępu.
  • Łącznik tożsamości: zadeklaruj api.identitySourceId, aby zidentyfikować zewnętrzne źródło tożsamości. W przypadku synchronizacji użytkowników zadeklaruj też api.customerId (unikalny identyfikator konta Google Workspace).

Deklaruj inne parametry dostarczane przez Google tylko wtedy, gdy chcesz zastąpić ich wartości domyślne. Szczegółowe informacje o generowaniu identyfikatorów i kluczy znajdziesz w sekcji Parametry dostarczane przez Google.

W pliku konfiguracyjnym możesz też zdefiniować parametry specyficzne dla repozytorium.

Przekazywanie pliku konfiguracji do oprogramowania sprzęgającego

Ustaw właściwość systemową config, aby przekazać plik konfiguracji. Podczas uruchamiania oprogramowania sprzęgającego użyj argumentu -D. Na przykład:

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

Jeśli pominiesz ten argument, pakiet SDK spróbuje użyć pliku o nazwie connector-config.properties w katalogu lokalnym.

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

Pakiet SDK zawiera szablon FullSyncIdentityConnector do synchronizowania wszystkich użytkowników i grup z repozytorium. W tej sekcji dowiesz się, jak z niej korzystać.

Ta sekcja odnosi się do kodu z przykładowego pliku IdentityConnectorSample.java, który odczytuje tożsamości z plików CSV.

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

Punkt wejścia to metoda main(). Tworzy instancję Application i wywołuje start(), aby uruchomić oprogramowanie sprzęgające.

Przed wywołaniem funkcji application.start() użyj funkcji IdentityApplication.Builder do utworzenia instancji szablonu FullSyncIdentityConnector.

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

Pakiet SDK wywołuje funkcję initConfig() po wywołaniu metody main()Application.build(). Metoda initConfig():

  1. Sprawdza, czy element Configuration nie został jeszcze zainicjowany.
  2. Inicjuje obiekt Configuration za pomocą par klucz-wartość dostarczonych przez Google.

Implementowanie interfejsu Repository

Repository synchronizuje tożsamości z repozytorium z tożsamościami Google. Gdy używasz szablonu, musisz zastąpić tylko niektóre metody. W przypadku FullSyncIdentityConnector zastąp te metody:

  • init(): do konfiguracji i inicjowania.
  • listUsers(): synchronizacja wszystkich użytkowników.
  • listGroups(): synchronizuje wszystkie grupy.
  • (Opcjonalnie) close(): do czyszczenia podczas zamykania.

Pobieranie parametrów konfiguracji niestandardowej

Pobierz parametry niestandardowe z obiektu Configuration, zwykle w metodzie init(). Poniższy fragment kodu pokazuje, jak pobrać ścieżki do plików CSV:

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 pobierania 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ć mapowania użytkowników. Ta metoda akceptuje punkt kontrolny, aby wznowić synchronizację w przypadku przerwania. Dla każdego użytkownika:

  1. Uzyskaj mapowanie między tożsamością Google a tożsamością zewnętrzną.
  2. Zapakuj parę do iteratora zwróconego przez listUsers().

Pobieranie mapowania użytkowników

Ten fragment kodu pokazuje, jak pobrać mapowania tożsamości z 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);
    }
  }
  // ...
}

Pakowanie mapowania użytkowników w iterator

Metoda listUsers() zwraca CheckpointCloseableIterable obiektów IdentityUser.

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

Uzyskiwanie grupy

Zastąp listGroups(), aby pobrać grupy i ich członków. Ta metoda akceptuje punkt kontrolny. Dla każdej grupy:

  1. Pobierz grupę i jej członków.
  2. Zapakuj je w iterator zwrócony przez listGroups().

Pobieranie tożsamości grupy

Ten fragment kodu pokazuje, jak pobrać grupy i członków z 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 CheckpointCloseableIterable obiektów IdentityGroup.

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

Następne kroki