یک اتصال دهنده هویت ایجاد کنید

به طور پیش‌فرض، جستجوی ابری گوگل فقط هویت‌های گوگل ذخیره شده در فهرست راهنمای ابری گوگل (کاربران و گروه‌ها) را تشخیص می‌دهد. رابط‌های هویت برای همگام‌سازی هویت‌های سازمانی شما با هویت‌های گوگل مورد استفاده توسط جستجوی ابری گوگل استفاده می‌شوند.

گوگل گزینه‌های زیر را برای توسعه رابط‌های هویتی ارائه می‌دهد:

  • کیت توسعه نرم‌افزاری رابط هویت (Identity Connector SDK). این گزینه برای توسعه‌دهندگانی است که با زبان برنامه‌نویسی جاوا برنامه‌نویسی می‌کنند. کیت توسعه نرم‌افزاری رابط هویت (Identity Connector SDK) یک پوشش پیرامون REST API است که به شما امکان می‌دهد به سرعت رابط‌ها (Connectors) ایجاد کنید. برای ایجاد یک رابط هویت با استفاده از SDK، به بخش «ایجاد یک رابط هویت با استفاده از SDK رابط هویت» مراجعه کنید.

  • یک API سطح پایین REST و کتابخانه‌های API. این گزینه‌ها برای توسعه‌دهندگانی است که ممکن است با جاوا برنامه‌نویسی نکنند یا کدبیس آنها با یک API REST یا یک کتابخانه سازگارتر باشد. برای ایجاد یک رابط هویت با استفاده از REST API، برای اطلاعات مربوط به نگاشت کاربران به Directory API: User Accounts و برای اطلاعات مربوط به نگاشت گروه‌ها به Cloud Identity Documentation مراجعه کنید.

با استفاده از SDK رابط هویت، یک رابط هویت ایجاد کنید

یک رابط هویت معمولی وظایف زیر را انجام می‌دهد:

  1. کانکتور را پیکربندی کنید.
  2. همه کاربران را از سیستم هویت سازمانی خود بازیابی کنید و آنها را برای همگام‌سازی با هویت‌های گوگل به گوگل ارسال کنید.
  3. تمام گروه‌ها را از سیستم هویت سازمانی خود بازیابی کنید و آنها را برای همگام‌سازی با هویت‌های گوگل به گوگل ارسال کنید.

وابستگی‌ها را تنظیم کنید

برای استفاده از SDK باید وابستگی‌های خاصی را در فایل ساخت خود لحاظ کنید. برای مشاهده وابستگی‌های محیط ساخت خود، روی تب زیر کلیک کنید:

ماون

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

گرادل

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

پیکربندی کانکتور خود را ایجاد کنید

هر کانکتور یک فایل پیکربندی دارد که شامل پارامترهای مورد استفاده کانکتور، مانند شناسه مخزن شما، است. پارامترها به صورت جفت‌های کلید-مقدار تعریف می‌شوند، مانند api.sourceId= 1234567890abcdef .

کیت توسعه نرم‌افزار جستجوی ابری گوگل (Google Cloud Search SDK) شامل چندین پارامتر پیکربندی ارائه شده توسط گوگل است که توسط همه کانکتورها استفاده می‌شود. شما باید پارامترهای ارائه شده توسط گوگل زیر را در فایل پیکربندی خود اعلام کنید:

  • برای یک رابط محتوا، باید api.sourceId و api.serviceAccountPrivateKeyFile را تعریف کنید، زیرا این پارامترها محل مخزن شما و کلید خصوصی مورد نیاز برای دسترسی به مخزن را مشخص می‌کنند.
  • برای یک رابط هویت، باید api.identitySourceId تعریف کنید زیرا این پارامتر محل منبع هویت خارجی شما را مشخص می‌کند. اگر کاربران را همگام‌سازی می‌کنید، باید api.customerId نیز به عنوان شناسه منحصر به فرد برای حساب Google Workspace شرکت خود تعریف کنید.

مگر اینکه بخواهید مقادیر پیش‌فرض سایر پارامترهای ارائه شده توسط گوگل را لغو کنید، نیازی به اعلام آنها در فایل پیکربندی خود ندارید. برای اطلاعات بیشتر در مورد پارامترهای پیکربندی ارائه شده توسط گوگل، مانند نحوه تولید شناسه‌ها و کلیدهای خاص، به پارامترهای پیکربندی ارائه شده توسط گوگل مراجعه کنید.

همچنین می‌توانید پارامترهای مختص مخزن خود را برای استفاده در فایل پیکربندی خود تعریف کنید.

فایل پیکربندی را به کانکتور ارسال کنید

ویژگی config سیستم را طوری تنظیم کنید که فایل پیکربندی را به کانکتور شما منتقل کند. می‌توانید این ویژگی را با استفاده از آرگومان -D هنگام شروع کانکتور تنظیم کنید. برای مثال، دستور زیر کانکتور را با فایل پیکربندی MyConfig.properties شروع می‌کند:

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

اگر این آرگومان وجود نداشته باشد، SDK تلاش می‌کند به یک فایل پیکربندی پیش‌فرض با نام connector-config.properties دسترسی پیدا کند.

با استفاده از یک کلاس الگو، یک رابط هویت همگام‌سازی کامل ایجاد کنید

کیت توسعه نرم‌افزاری Identity Connector شامل یک کلاس الگوی FullSyncIdentityConnector است که می‌توانید از آن برای همگام‌سازی همه کاربران و گروه‌ها از مخزن identity با هویت‌های گوگل استفاده کنید. این بخش نحوه استفاده از الگوی FullSyncIdentityConnector را برای انجام همگام‌سازی کامل کاربران و گروه‌ها از یک مخزن identity غیر گوگل توضیح می‌دهد.

این بخش از مستندات به قطعه کدهایی از نمونه IdentityConnecorSample.java اشاره دارد. این نمونه، هویت‌های کاربر و گروه را از دو فایل CSV می‌خواند و آنها را با هویت‌های گوگل همگام‌سازی می‌کند.

نقطه ورود کانکتور را پیاده‌سازی کنید

نقطه ورود به یک کانکتور، متد main() است. وظیفه اصلی این متد ایجاد یک نمونه از کلاس Application و فراخوانی متد start() آن برای اجرای کانکتور است.

قبل از فراخوانی application.start() ، از کلاس IdentityApplication.Builder برای نمونه‌سازی الگوی FullSyncIdentityConnector استفاده کنید. FullSyncIdentityConnector یک شیء Repository را می‌پذیرد که متدهای آن را پیاده‌سازی خواهید کرد. قطعه کد زیر نحوه پیاده‌سازی متد 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();
}

در پشت صحنه، SDK متد initConfig() را پس از فراخوانی Application.build توسط متد main() کانکتور شما، فراخوانی می‌کند. متد initConfig() وظایف زیر را انجام می‌دهد:

  1. متد Configuation.isInitialized() را فراخوانی می‌کند تا مطمئن شود که Configuration مقداردهی اولیه نشده است.
  2. یک شیء Configuration را با جفت‌های کلید-مقدار ارائه شده توسط گوگل مقداردهی اولیه می‌کند. هر جفت کلید-مقدار در یک شیء ConfigValue درون شیء Configuration ذخیره می‌شود.

پیاده‌سازی رابط Repository )

تنها هدف شیء Repository ، همگام‌سازی هویت‌های مخزن با هویت‌های گوگل است. هنگام استفاده از یک الگو، فقط باید متدهای خاصی را در رابط Repository برای ایجاد یک اتصال‌دهنده هویت، بازنویسی کنید. برای FullTraversalConnector ، احتمالاً متدهای زیر را بازنویسی خواهید کرد:

  • متد init() . برای انجام هرگونه تنظیم و مقداردهی اولیه مخزن هویت، متد `init()` را بازنویسی کنید.

  • متد listUsers() . برای همگام‌سازی همه کاربران موجود در مخزن هویت با کاربران گوگل، متد listUsers() را بازنویسی کنید.

  • متد listGroups() . برای همگام‌سازی همه گروه‌های موجود در مخزن هویت با گروه‌های گوگل، متد listGroups() را بازنویسی کنید.

  • (اختیاری) متد close() . اگر نیاز به پاکسازی مخزن دارید، متد close() را بازنویسی کنید. این متد یک بار در هنگام خاموش شدن کانکتور فراخوانی می‌شود.

دریافت پارامترهای پیکربندی سفارشی

به عنوان بخشی از مدیریت پیکربندی کانکتور، شما نیاز به دریافت پارامترهای سفارشی از شیء Configuration خواهید داشت. این کار معمولاً در متد init() کلاس Repository انجام می‌شود.

کلاس Configuration چندین متد برای دریافت انواع داده‌های مختلف از یک پیکربندی دارد. هر متد یک شیء ConfigValue را برمی‌گرداند. سپس از متد get() شیء ConfigValue برای بازیابی مقدار واقعی استفاده خواهید کرد. قطعه کد زیر نحوه بازیابی مقادیر userMappingCsvPath و groupMappingCsvPath را از یک شیء 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();
}

برای دریافت و تجزیه یک پارامتر حاوی چندین مقدار، از یکی از تجزیه‌کننده‌های نوع کلاس Configuration برای تجزیه داده‌ها به تکه‌های گسسته استفاده کنید. قطعه کد زیر، از رابط آموزشی، از متد getMultiValue برای دریافت لیستی از نام‌های مخزن GitHub استفاده می‌کند:

مخزن گیت‌هاب.جاوا
ConfigValue<List<String>> repos = Configuration.getMultiValue(
    "github.repos",
    Collections.emptyList(),
    Configuration.STRING_PARSER);

نقشه برداری را برای همه کاربران دریافت کنید

برای بازیابی نگاشت همه کاربران از مخزن هویت خود، تابع listUsers() را نادیده بگیرید. متد listUsers() یک نقطه بررسی (checkpoint) را می‌پذیرد که نشان دهنده آخرین هویتی است که باید همگام‌سازی شود. در صورت قطع شدن فرآیند، می‌توان از این نقطه بررسی برای از سرگیری همگام‌سازی استفاده کرد. برای هر کاربر در مخزن خود، این مراحل را در متد listUsers() انجام خواهید داد:

  1. یک نگاشت شامل هویت گوگل و هویت خارجی مرتبط دریافت کنید.
  2. این جفت را در یک تکرارکننده که توسط متد listUsers() برگردانده می‌شود، بسته‌بندی کنید.

نقشه کاربری دریافت کنید

قطعه کد زیر نحوه بازیابی نگاشت‌های هویت ذخیره شده در یک فایل 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);
    }
  }
  // ...
}

بسته‌بندی نگاشت کاربر در یک تکرارکننده

متد listUsers() یک Iterator ، به طور خاص یک CheckpointCloseableIterable ، از اشیاء IdentityUser را برمی‌گرداند. می‌توانید از کلاس CheckpointClosableIterableImpl.Builder برای ساخت و بازگرداندن یک iterator استفاده کنید. قطعه کد زیر نحوه بسته‌بندی هر نگاشت در لیست و ساخت iterator از آن لیست را نشان می‌دهد:

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

یک گروه دریافت کنید

برای بازیابی همه گروه‌ها و اعضای آنها از مخزن هویت خود، تابع listGroups() را نادیده بگیرید. متد listGroups() یک Checkpoint می‌پذیرد که نشان دهنده آخرین هویتی است که باید همگام‌سازی شود. در صورت قطع شدن فرآیند، می‌توان از Checkpoint برای از سرگیری همگام‌سازی استفاده کرد. برای هر کاربر در مخزن خود، این مراحل را در متد listGroups() انجام خواهید داد:

  1. گروه و اعضای آن را دریافت کنید.
  2. هر گروه و اعضا را در یک تکرارکننده که توسط متد listGroups() برگردانده می‌شود، بسته‌بندی کنید.

دریافت شناسه گروه

قطعه کد زیر نحوه بازیابی گروه‌ها و اعضای ذخیره شده در یک فایل 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);
    }
  }
  // ...

}

گروه و اعضا را در یک تکرارکننده بسته‌بندی کنید

متد listGroups() یک Iterator ، به طور خاص یک CheckpointCloseableIterable ، از اشیاء IdentityGroup را برمی‌گرداند. می‌توانید از کلاس CheckpointClosableIterableImpl.Builder برای ساخت و بازگرداندن یک iterator استفاده کنید. قطعه کد زیر نحوه بسته‌بندی هر گروه و اعضا در یک لیست و ساخت iterator از آن لیست را نشان می‌دهد:

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

مراحل بعدی

در اینجا چند گام بعدی که می‌توانید بردارید، آورده شده است: