पहचान कनेक्टर बनाएं

डिफ़ॉल्ट रूप से, Google Cloud Search सिर्फ़ Google Cloud Directory (उपयोगकर्ता और ग्रुप) में सेव की गई Google पहचानों को पहचानता है. आइडेंटिटी कनेक्टर का इस्तेमाल, आपके एंटरप्राइज़ की पहचानों को Google Cloud Search में इस्तेमाल की जाने वाली Google पहचानों के साथ सिंक करने के लिए किया जाता है.

Google, आइडेंटिटी कनेक्टर बनाने के लिए ये विकल्प उपलब्ध कराता है:

  • Identity Connector SDK. यह विकल्प उन डेवलपर के लिए है जो Java प्रोग्रामिंग लैंग्वेज में प्रोग्रामिंग कर रहे हैं. Identity Connector SDK टूल, REST API के लिए एक रैपर है. इसकी मदद से, तुरंत कनेक्टर बनाए जा सकते हैं. SDK टूल का इस्तेमाल करके, पहचान से जुड़ा कनेक्टर बनाने के लिए, Identity Connector SDK टूल का इस्तेमाल करके, पहचान से जुड़ा कनेक्टर बनाना लेख पढ़ें.

  • लो-लेवल REST API और एपीआई लाइब्रेरी. ये विकल्प उन डेवलपर के लिए हैं जो शायद Java में प्रोग्रामिंग न कर रहे हों या जिनके कोडबेस में REST API या लाइब्रेरी बेहतर तरीके से काम करती हो. REST API का इस्तेमाल करके आइडेंटिटी कनेक्टर बनाने के लिए, उपयोगकर्ताओं को मैप करने के बारे में जानकारी पाने के लिए, Directory API: User Accounts और ग्रुप को मैप करने के बारे में जानकारी पाने के लिए, Cloud Identity दस्तावेज़ देखें.

Identity Connector SDK का इस्तेमाल करके, आइडेंटिटी कनेक्टर बनाना

सामान्य तौर पर, आइडेंटिटी कनेक्टर ये काम करता है:

  1. कनेक्टर को कॉन्फ़िगर करें.
  2. अपने एंटरप्राइज़ आइडेंटिटी सिस्टम से सभी उपयोगकर्ताओं को वापस पाएं और उन्हें Google आइडेंटिटी के साथ सिंक करने के लिए Google को भेजें.
  3. अपने एंटरप्राइज़ आइडेंटिटी सिस्टम से सभी ग्रुप वापस पाएं और उन्हें Google आइडेंटिटी के साथ सिंक करने के लिए Google को भेजें.

डिपेंडेंसी सेट अप करना

SDK टूल का इस्तेमाल करने के लिए, आपको अपनी बिल्ड फ़ाइल में कुछ डिपेंडेंसी शामिल करनी होंगी. अपने बिल्ड एनवायरमेंट के लिए डिपेंडेंसी देखने के लिए, नीचे दिए गए किसी टैब पर क्लिक करें:

Maven

<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 में, Google के कई कॉन्फ़िगरेशन पैरामीटर होते हैं. इनका इस्तेमाल सभी कनेक्टर करते हैं. आपको अपनी कॉन्फ़िगरेशन फ़ाइल में, Google के दिए गए इन पैरामीटर का एलान करना होगा:

  • कॉन्टेंट कनेक्टर के लिए, आपको api.sourceId और api.serviceAccountPrivateKeyFile की जानकारी देनी होगी. ऐसा इसलिए, क्योंकि ये पैरामीटर आपके रिपॉज़िटरी की जगह और रिपॉज़िटरी को ऐक्सेस करने के लिए ज़रूरी निजी कुंजी की पहचान करते हैं.
  • आइडेंटिटी कनेक्टर के लिए, आपको api.identitySourceId एट्रिब्यूट की वैल्यू सबमिट करनी होगी. ऐसा इसलिए, क्योंकि यह पैरामीटर आपके एक्सटर्नल आइडेंटिटी सोर्स की जगह की जानकारी देता है. अगर उपयोगकर्ताओं को सिंक किया जा रहा है, तो आपको अपने एंटरप्राइज़ के Google Workspace खाते के लिए, api.customerId को यूनीक आईडी के तौर पर भी एलान करना होगा.

अगर आपको Google के दिए गए अन्य पैरामीटर की डिफ़ॉल्ट वैल्यू बदलनी नहीं हैं, तो आपको उन्हें अपनी कॉन्फ़िगरेशन फ़ाइल में बताने की ज़रूरत नहीं है. Google से मिले कॉन्फ़िगरेशन पैरामीटर के बारे में ज़्यादा जानकारी के लिए, Google से मिले कॉन्फ़िगरेशन पैरामीटर लेख पढ़ें. इसमें, कुछ आईडी और कुंजियों को जनरेट करने का तरीका भी बताया गया है.

कॉन्फ़िगरेशन फ़ाइल में इस्तेमाल करने के लिए, अपनी पसंद के हिसाब से कोई भी पैरामीटर तय किया जा सकता है.

कनेक्टर को कॉन्फ़िगरेशन फ़ाइल पास करना

कॉन्फ़िगरेशन फ़ाइल को अपने कनेक्टर पर भेजने के लिए, सिस्टम प्रॉपर्टी config सेट करें. कनेक्टर शुरू करते समय, -D आर्ग्युमेंट का इस्तेमाल करके प्रॉपर्टी सेट की जा सकती है. उदाहरण के लिए, यह कमांड MyConfig.properties कॉन्फ़िगरेशन फ़ाइल के साथ कनेक्टर को शुरू करता है:

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

अगर यह आर्ग्युमेंट मौजूद नहीं है, तो SDK, connector-config.properties नाम की डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल को ऐक्सेस करने की कोशिश करता है.

टेंप्लेट क्लास का इस्तेमाल करके, पूरी तरह सिंक होने वाला आइडेंटिटी कनेक्टर बनाना

Identity Connector SDK टूल में एक FullSyncIdentityConnector टेंप्लेट क्लास होती है. इसका इस्तेमाल, पहचान से जुड़ी जानकारी के डेटाबेस से सभी उपयोगकर्ताओं और ग्रुप को Google की पहचान से सिंक करने के लिए किया जा सकता है. इस सेक्शन में, FullSyncIdentityConnector टेंप्लेट का इस्तेमाल करके, Google से बाहर के आइडेंटिटी रिपॉज़िटरी से उपयोगकर्ताओं और ग्रुप को पूरी तरह सिंक करने का तरीका बताया गया है.

दस्तावेज़ों के इस सेक्शन में, IdentityConnecorSample.java सैंपल के कोड स्निपेट के बारे में बताया गया है. यह सैंपल, दो CSV फ़ाइलों से उपयोगकर्ता और ग्रुप की पहचानें पढ़ता है और उन्हें Google की पहचानों के साथ सिंक करता है.

कनेक्टर के एंट्री पॉइंट को लागू करना

कनेक्टर का एंट्री पॉइंट, main() तरीका होता है. इस तरीके का मुख्य काम, Application क्लास का इंस्टेंस बनाना और कनेक्टर को चलाने के लिए, उसका start() तरीका शुरू करना है.

application.start() को कॉल करने से पहले, FullSyncIdentityConnector टेंप्लेट को इंस्टैंशिएट करने के लिए, IdentityApplication.Builder क्लास का इस्तेमाल करें. 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();
}

आपके कनेक्टर के main() तरीके के Application.build को कॉल करने के बाद, SDK टूल initConfig() तरीके को कॉल करता है. initConfig() तरीका ये काम करता है:

  1. यह तरीका, Configuation.isInitialized() को कॉल करता है, ताकि यह पक्का किया जा सके कि Configuration को शुरू नहीं किया गया है.
  2. Google की ओर से दिए गए कीवर्ड-वैल्यू जोड़े की मदद से, Configuration ऑब्जेक्ट को शुरू करता है. हर की-वैल्यू पेयर, Configuration ऑब्जेक्ट में ConfigValue ऑब्जेक्ट में स्टोर किया जाता है.

Repository इंटरफ़ेस लागू करना

Repository ऑब्जेक्ट का मकसद, Google आइडेंटिटी के साथ रिपॉज़िटरी आइडेंटिटी को सिंक करना है. टेंप्लेट का इस्तेमाल करते समय, आपको आइडेंटिटी कनेक्टर बनाने के लिए, Repository इंटरफ़ेस में सिर्फ़ कुछ तरीकों को बदलना होगा. FullTraversalConnector के लिए, आपको नीचे दिए गए तरीकों को बदलना पड़ सकता है:

  • init() तरीका. किसी भी आइडेंटिटी रिपॉज़िटरी को सेट अप और शुरू करने के लिए, `init() method को बदलें.

  • listUsers() तरीका. आइडेंटिटी रिपॉज़िटरी में मौजूद सभी उपयोगकर्ताओं को Google उपयोगकर्ताओं के साथ सिंक करने के लिए, listUsers() तरीके को बदलें.

  • listGroups() तरीका. पहचान के डेटाबेस में मौजूद सभी ग्रुप को Google Groups के साथ सिंक करने के लिए, listGroups() तरीके को बदलें.

  • (ज़रूरी नहीं) close() का तरीका. अगर आपको रिपॉज़िटरी को खाली करना है, तो close() तरीका बदलें. कनेक्टर के बंद होने के दौरान, इस तरीके को एक बार कॉल किया जाता है.

कस्टम कॉन्फ़िगरेशन पैरामीटर पाना

अपने कनेक्टर के कॉन्फ़िगरेशन को मैनेज करने के लिए, आपको Configuration ऑब्जेक्ट से कोई कस्टम पैरामीटर पाना होगा. आम तौर पर, यह टास्क Repository क्लास के init() तरीके में किया जाता है.

Configuration क्लास में, कॉन्फ़िगरेशन से अलग-अलग डेटा टाइप पाने के कई तरीके हैं. हर तरीका, एक ConfigValue ऑब्जेक्ट दिखाता है. इसके बाद, असल वैल्यू पाने के लिए, ConfigValue ऑब्जेक्ट के get() तरीके का इस्तेमाल किया जाएगा. यहां दिए गए स्निपेट में, Configuration ऑब्जेक्ट से userMappingCsvPath और groupMappingCsvPath वैल्यू को वापस पाने का तरीका बताया गया है:

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 क्लास के टाइप पार्सर में से किसी एक का इस्तेमाल करें. ट्यूटोरियल कनेक्टर से लिया गया यह स्निपेट, GitHub रिपॉज़िटरी के नामों की सूची पाने के लिए, getMultiValue तरीका इस्तेमाल करता है:

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

सभी उपयोगकर्ताओं के लिए मैपिंग पाना

अपने आइडेंटिटी रिपॉज़िटरी से सभी उपयोगकर्ताओं की मैपिंग वापस पाने के लिए, listUsers() को बदलें. listUsers() वाला तरीका, एक चेकपॉइंट स्वीकार करता है, जो सिंक की गई आखिरी पहचान को दिखाता है. अगर सिंक करने की प्रोसेस में रुकावट आती है, तो चेकपॉइंट का इस्तेमाल करके सिंक करने की प्रोसेस को फिर से शुरू किया जा सकता है. अपने रिपॉज़िटरी में मौजूद हर उपयोगकर्ता के लिए, आपको listUsers() तरीके में यह तरीका अपनाना होगा:

  1. Google की पहचान और उससे जुड़ी बाहरी पहचान की मैपिंग पाएं.
  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() वाला तरीका, IdentityUser ऑब्जेक्ट का Iterator, खास तौर पर CheckpointCloseableIterable दिखाता है. CheckpointClosableIterableImpl.Builder क्लास का इस्तेमाल करके, कोई आइटरेटर बनाया जा सकता है और उसे दिखाया जा सकता है. नीचे दिया गया कोड स्निपेट, हर मैपिंग को सूची में पैकेज करने और उस सूची से, इटरेटर बनाने का तरीका दिखाता है:

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

ग्रुप बनाना

अपनी पहचान से जुड़ी जानकारी के डेटाबेस से सभी ग्रुप और उनके सदस्यों की जानकारी वापस पाने के लिए, listGroups() को बदलें. listGroups() का तरीका, सिंक की गई आखिरी पहचान को दिखाने वाले चेकपॉइंट को स्वीकार करता है. अगर सिंक करने की प्रोसेस में रुकावट आती है, तो चेकपॉइंट का इस्तेमाल करके सिंक करने की प्रोसेस को फिर से शुरू किया जा सकता है. अपने रिपॉज़िटरी में मौजूद हर उपयोगकर्ता के लिए, आपको listGroups() तरीके में ये चरण पूरे करने होंगे:

  1. ग्रुप और उसके सदस्यों की जानकारी पाएं.
  2. हर ग्रुप और सदस्यों को, listGroups() तरीके से दिखाए गए iterator में पैकेज करें.

ग्रुप आइडेंटिटी पाना

यहां दिया गया कोड स्निपेट, 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() वाला तरीका, IdentityGroup ऑब्जेक्ट का Iterator, खास तौर पर CheckpointCloseableIterable दिखाता है. CheckpointClosableIterableImpl.Builder क्लास का इस्तेमाल करके, कोई आइटरेटर बनाया जा सकता है और उसे दिखाया जा सकता है. नीचे दिए गए कोड स्निपेट में, हर ग्रुप और सदस्यों को सूची में पैकेज करने और उस सूची से iterator बनाने का तरीका बताया गया है:

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

अगले चरण

यहां कुछ ऐसे तरीके दिए गए हैं जिनका इस्तेमाल करके, इस समस्या को हल किया जा सकता है:

  • (ज़रूरी नहीं) बंद करने से पहले, किसी भी संसाधन को रिलीज़ करने के लिए, close() तरीका लागू करें.
  • (ज़रूरी नहीं) Content Connector SDK का इस्तेमाल करके, कॉन्टेंट कनेक्टर बनाएं.