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

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

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

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

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

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

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

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

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

این وابستگی‌ها را در فایل ساخت خود لحاظ کنید.

ماون

<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 استفاده کنید. به عنوان مثال:

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

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

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

SDK شامل یک الگوی FullSyncIdentityConnector برای همگام‌سازی همه کاربران و گروه‌ها از مخزن شما است. در این بخش نحوه استفاده از آن توضیح داده شده است.

این بخش به کدی از نمونه IdentityConnectorSample.java اشاره دارد که هویت‌ها را از فایل‌های CSV می‌خواند.

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

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

قبل از فراخوانی application.start() ، از IdentityApplication.Builder برای نمونه‌سازی الگوی 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();
}

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

  1. اطمینان حاصل می‌کند که Configuration از قبل مقداردهی اولیه نشده است.
  2. شیء Configuration را با جفت‌های کلید-مقدار ارائه شده توسط گوگل، مقداردهی اولیه می‌کند.

پیاده‌سازی رابط مخزن (Repository)

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

  • init() : برای راه‌اندازی و مقداردهی اولیه.
  • listUsers() : برای همگام‌سازی همه کاربران.
  • listGroups() : برای همگام‌سازی همه گروه‌ها.
  • (اختیاری) close() : برای پاکسازی در حین خاموش شدن سیستم.

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

پارامترهای سفارشی را از شیء Configuration ، معمولاً در متد init() بازیابی کنید. قطعه کد زیر نحوه بازیابی مسیرهای 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();
}

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

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

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

برای بازیابی نگاشت‌های کاربر، تابع 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() یک CheckpointCloseableIterable از اشیاء IdentityUser برمی‌گرداند.

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

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

برای بازیابی گروه‌ها و اعضای آنها، تابع listGroups() را بازنویسی کنید. این متد یک Checkpoint می‌پذیرد. برای هر گروه:

  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() یک CheckpointCloseableIterable از اشیاء IdentityGroup را برمی‌گرداند.

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

مراحل بعدی