Utwórz łącznik tożsamości

Domyślnie Google Cloud Search rozpoznaje tylko tożsamości Google przechowywane w Google Cloud Directory (użytkownicy i grupy). Oprogramowanie sprzęgające tożsamości służy do synchronizowania tożsamości firmy z tożsamościami Google używanymi przez Google Cloud Search.

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

  • Identity Connector SDK. Ta opcja jest przeznaczona dla programistów programujących w języku Java. Identity Connector SDK to pakiet obejmujący interfejs API REST, który umożliwia szybkie tworzenie oprogramowania sprzęgającego. Aby utworzyć oprogramowanie sprzęgające tożsamości za pomocą pakietu SDK, zapoznaj się z informacjami na temat tworzenia oprogramowania sprzęgającego tożsamości przy użyciu pakietu SDK Identity Connector.

  • Niskopoziomowy interfejs API typu REST i biblioteki API. Te opcje są przeznaczone dla programistów, którzy niekoniecznie programują w Javie lub których baza kodu lepiej pasuje do interfejsu API typu REST bądź biblioteki. Aby utworzyć oprogramowanie sprzęgające tożsamości za pomocą interfejsu API REST, informacje o mapowaniu użytkowników znajdziesz w artykule Directory API: Konta użytkowników, a w dokumentacji Cloud Identity (informacje o grupach mapowania).

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

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 firmowych i wyślij ich do Google, aby zsynchronizować je z tożsamościami Google.
  3. Pobierz wszystkie grupy z systemu tożsamości firmowych i wyślij je do Google, aby zsynchronizować je z tożsamościami Google.

Skonfiguruj zależności

Aby korzystać z pakietu SDK, musisz w pliku kompilacji uwzględnić określone zależności. Kliknij kartę poniżej, aby wyświetlić zależności dotyczące ś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żde oprogramowanie sprzęgające ma plik konfiguracji zawierający parametry używane przez oprogramowanie sprzęgające, takie jak identyfikator repozytorium. Parametry są zdefiniowane w postaci par klucz-wartość, np. api.sourceId=1234567890abcdef.

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

  • W przypadku oprogramowania sprzęgającego treści musisz zadeklarować api.sourceId i api.serviceAccountPrivateKeyFile, ponieważ te parametry identyfikują lokalizację repozytorium i klucz prywatny potrzebny do uzyskania dostępu do repozytorium.
  • W przypadku oprogramowania sprzęgającego 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ąpić wartości domyślnych innych parametrów dostarczonych przez Google, nie musisz deklarować ich w pliku konfiguracji. Więcej informacji o parametrach konfiguracji dostarczonych przez Google, na przykład o generowaniu określonych identyfikatorów i kluczy, znajdziesz w artykule o parametrach konfiguracyjnych udostępnionych przez Google.

Możesz też zdefiniować własne parametry repozytorium do wykorzystania w pliku konfiguracji.

Przekaż plik konfiguracji do oprogramowania sprzęgającego

Ustaw właściwość systemową config, aby przekazać plik konfiguracji do łącznika. Możesz ustawić właściwość za pomocą argumentu -D podczas uruchamiania oprogramowania sprzęgającego. Na przykład poniższe polecenie uruchamia oprogramowanie sprzęgające z plikiem konfiguracji MyConfig.properties:

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

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

Utwórz oprogramowanie sprzęgające tożsamości w pełnej synchronizacji za pomocą klasy szablonu

Pakiet Identity Connector SDK zawiera klasę szablonu FullSyncIdentityConnector, której możesz używać do synchronizowania wszystkich użytkowników i grup z repozytorium tożsamości z tożsamościami Google. Ta sekcja wyjaśnia, jak przy użyciu szablonu FullSyncIdentityConnector przeprowadzić pełną synchronizację kont użytkowników i grup z repozytorium tożsamości innego niż Google.

Ta sekcja dokumentacji dotyczy fragmentów kodu z przykładu IdentityConnecorSample.java. Ten przykład pozwala odczytać tożsamości użytkowników i grup z 2 plików CSV i synchronizuje je z tożsamościami Google.

Wdróż punkt wejścia oprogramowania sprzęgającego

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

Zanim wywołasz application.start(), użyj klasy IdentityApplication.Builder, aby utworzyć instancję szablonu FullSyncIdentityConnector. FullSyncIdentityConnector akceptuje obiekt Repository, którego metody wdrożysz. Fragment kodu, który 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 metody main() oprogramowania sprzęgającego Application.build. Metoda initConfig() wykonuje te zadania:

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

Wdrażanie interfejsu Repository

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

  • Metoda init(). Aby skonfigurować i zainicjować dowolne 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 dyskusyjnymi Google, zastąp metodę listGroups().

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

Pobierz niestandardowe parametry konfiguracji

W ramach konfiguracji oprogramowania sprzęgającego musisz pobrać wszelkie parametry niestandardowe z obiektu Configuration. To zadanie jest zwykle wykonywane w metodzie klasy Repository init().

Klasa Configuration ma kilka metod pobierania różnych typów danych z konfiguracji. Każda metoda zwraca obiekt ConfigValue. Następnie użyj metody get() obiektu ConfigValue, aby pobrać rzeczywistą wartość. Ten fragment kodu pokazuje, jak pobrać wartości userMappingCsvPath i groupMappingCsvPath 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 do przeanalizowania danych na dyskretne fragmenty. Ten fragment kodu z oprogramowania sprzęgającego 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);

Pobierz mapowanie 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ść do synchronizacji. Za pomocą punktu kontrolnego można wznowić synchronizację w przypadku przerwania procesu. W przypadku każdego użytkownika w repozytorium wykonaj te czynności w metodzie listUsers():

  1. Pobierz mapowanie składające się z tożsamości Google i powiązanej tożsamości zewnętrznej.
  2. Zapakuj parę do iteratora zwróconego przez metodę listUsers().

Pobieranie mapowania użytkownika

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

Pakowanie mapowania użytkownika w iterator

Metoda listUsers() zwraca Iterator, a w szczególności CheckpointCloseableIterable obiektów IdentityUser. Za pomocą klasy CheckpointClosableIterableImpl.Builder możesz utworzyć i zwrócić iterator. Ten fragment kodu pokazuje, jak spakować każde mapowanie w formie listy i na podstawie tej listy utworzyć iterator:

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

Pobierz grupę

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. Za jego pomocą możesz wznowić synchronizację w przypadku przerwania procesu. W metodzie listGroups() w przypadku każdego użytkownika w repozytorium wykonaj te czynności:

  1. Pobierz grupę i jej członków.
  2. Umieść każdą grupę i członków w iteratorze zwracanym przez metodę listGroups().

Pobieranie tożsamości grupy

Ten fragment kodu pokazuje, jak pobrać grupy i członków przechowywane 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);
    }
  }
  // ...

}

Umieszczanie grupy i członków w iteratorze

Metoda listGroups() zwraca Iterator, a w szczególności CheckpointCloseableIterable obiektów IdentityGroup. Za pomocą klasy CheckpointClosableIterableImpl.Builder możesz utworzyć i zwrócić iterator. Poniższy fragment kodu pokazuje, jak spakować każdą grupę i członków w listę oraz utworzyć na jej podstawie iterator:

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

Dalsze kroki

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