ย้ายข้อมูลจากบริการ Groups ไปยังบริการ Cloud Identity Groups Advanced

บริการขั้นสูงของกลุ่ม Cloud Identity (CIG) มีฟีเจอร์ที่เทียบเท่ากับ Groups Service API และสามารถใช้แทนได้

ดูวิธีการช่วยที่ระบุไว้เพื่อดูวิธีใช้ความสามารถที่เทียบเท่า ผ่าน CIG Advanced Service

ตั้งค่า

หากต้องการใช้ CIG Advanced Service ให้เปิดใช้ ภายในโปรเจ็กต์สคริปต์ก่อน

เราได้กำหนดตัวแปรต่อไปนี้เพื่อย่อลายเซ็นของเมธอดบางรายการในคู่มือนี้

const groups = CloudIdentityGroups.Groups;

เมธอด GroupsApp

เมธอดตัวช่วยต่อไปนี้สอดคล้องกับเมธอดของบริการกลุ่ม GroupsApp

ในคู่มือนี้ คำว่ากลุ่มหมายถึงทรัพยากรกลุ่ม ซึ่งแตกต่างจากออบเจ็กต์คลาสกลุ่ม ทรัพยากรกลุ่ม คือออบเจ็กต์ JavaScript ที่ไม่มีเมธอด แต่สามารถใช้ใน CIG Advanced Service เพื่อดึงข้อมูลที่คล้ายกับข้อมูลในออบเจ็กต์คลาสกลุ่ม ได้

getGroupByEmail

/**
 * Given a group's email, returns that group's resource
 *
 * @param {String} email: The email address to lookup a group by
 * @return {Group} group: The group resource associated with the email
 */
function groupsAppGetGroupByEmail(email) {
  // Retrieve the name ID of the group
  const groupName = groups.lookup({
    'groupKey.id': email,
    'groupKey.namespace': ''  // Optional for google groups, dynamic groups, and security groups
                              // Necessary for identity-mapped groups (see https://developers.google.com/cloud-search/docs/guides/identity-mapping)
  }).name;

  // Retrieve the group resource
  return groups.get(groupName);
}

getGroups

เมธอด Helper ต่อไปนี้จะแสดงรายการทรัพยากรการเป็นสมาชิก เข้าถึงgroupฟิลด์ขององค์ประกอบเพื่อค้นหารหัสชื่อ ซึ่งมีประโยชน์สำหรับ วิธีการหลายอย่างของบริการขั้นสูงของ CIG ในทำนองเดียวกัน ให้เข้าถึง groupKey.id ของ องค์ประกอบเพื่อค้นหาอีเมล

/**
 * Retrieves all the membership relation resources to groups which you are a
 * direct member (or a pending member).
 *
 * @return {Array<MembershipRelation>} groups : List of direct memberships where
 * you are the member.
 */
function groupsAppGetGroups() {
  const myEmail = Session.getActiveUser().getEmail();
  let pageToken = '';
  let membershipList = [];

  do {
    const queryParams = {
      query:`member_key_id=='${myEmail}'`,
      pageToken:pageToken
    };
    const searchResult = groups.Memberships.searchDirectGroups('groups/-', queryParams);
    membershipList = membershipList.concat(searchResult.memberships);
    pageToken = searchResult.nextPageToken;
  } while (pageToken);

  return membershipList;
}

วิธีการของกลุ่ม

เมธอดตัวช่วยต่อไปนี้สอดคล้องกับเมธอดของบริการกลุ่ม Groups Class

getEmail

/**
 * Gets a group's email address
 *
 * @param {Object} group: A group resource
 * @return {String} email: The email associated with the group resource.
 */
function getEmail(group) {
  return group.groupKey.id;
}

getGroups

วิธีต่อไปนี้ใช้ Memberships.list ซึ่งจะดึงข้อมูลการเป็นสมาชิกทั้งหมดในกลุ่มที่ระบุ ซึ่งอาจรวมถึง การเป็นสมาชิกของผู้ใช้และกลุ่ม

หากต้องการประมาณค่าเมธอด getGroups ของบริการกลุ่มให้ดียิ่งขึ้น เราสามารถกรองการเป็นสมาชิกตามTypeได้ เราจะได้รับสิทธิ์เข้าถึงฟิลด์นี้โดยการระบุ FULL View เป็นพารามิเตอร์การค้นหาไปยัง Memberships.list หรือโดยการดำเนินการ Memberships.lookup แต่ละรายการสำหรับการเป็นสมาชิกที่ระบุ

/**
 * Fetch a list of memberships with provided group as its parent
 *
 * @param {Group} group: A group resource
 * @return {Array<Membership>} membershipList: The memberships where the parent
 * is the provided group and member is a also a group.
 */
function getGroups(group) {
  let membershipList = [];
  let pageToken = '';

  do {
    // Fetch a page of memberships
    const queryParams = {
      view: 'FULL',
      pageToken: pageToken
    }
    const response = groups.Memberships.list(group.name, queryParams);

    // Filter non-group memberships
    const onlyGroupMemberships = response.memberships.filter(
      membership => membership.type == 'GROUP'
    );
    membershipList = membershipList.concat(onlyGroupMemberships);

    // Set up next page
    pageToken = response.nextPageToken;
  } while(pageToken);

  return membershipList;
}

getRole และ getRoles

แม้ว่าบริการกลุ่มอาจแสดงเฉพาะบทบาทที่มีลำดับความสำคัญสูงสุดในgetRole() แต่ฟิลด์ roles ในทรัพยากรสมาชิกจะมีองค์ประกอบแยกต่างหากสำหรับแต่ละบทบาทที่สมาชิกมีสิทธิ์ (เช่น MEMBER, OWNER, ADMIN)

/**
 * Retrieve the membership roles of a member to a group.
 *
 * @param {Group} containingGroup: The group whom the member belongs to
 * @param {String} email: The email address associated with a member that
 * belongs to the containingGroup
 * @return {Array<Role>} roles: List of roles the member holds with respect to
 * the containingGroup.
 */
function getRoleWithEmail(containingGroup, email) {
  // First fetch the membership
  const membershipName = groups.Memberships.lookup(containingGroup.name, { 'memberKey.id': email }).name;
  const membership = groups.Memberships.get(membershipName);

  // Then retrieve the role
  return membership.roles;
}

/**
 * Retrieve the membership roles of a member to a group.
 *
 * @param {Group} containingGroup: The group resource whom the member belongs to
 * @param {User} user: The user associated with a member that belongs to the
 * containingGroup
 * @return {Array<Role>} roles: List of roles the member holds with respect to
 * the containingGroup
 */
function getRoleWithUser(containingGroup, user) {
  return getRoleWithEmail(containingGroup, user.getEmail());
}

/**
 * Retrieve the membership roles of a group of members to a group
 *
 * @param {Group} containingGroup: The group resource to which roles are
 * relevant
 * @param {Array<User>} users: List of users to fetch roles from
 * @return {Array<Array<Role>>} roles: A list where every element is a list of
 * roles of member to the containingGroup
 */
function getRoles(containingGroup, users) {
  let roles = [];
  for (const user of users) {
    roles.push(getRoleWithUser(containingGroup, user));
  }
  return roles;
}

getUsers

เช่นเดียวกับแนวทางใน getGroups เราสามารถดึงข้อมูลการเป็นสมาชิกของกลุ่มได้ด้วย Memberships.list และกรองผลลัพธ์เพื่อเก็บเฉพาะ Type เป้าหมายไว้

/**
 * Given a group, retrieve its direct members and banned members of the group
 * that have a known corresponding Google Account.
 *
 * @param {Group} group: The group Resource whom the users being queried belong
 * to
 * @return {Array<String>} users: A list of emails associated with members of
 * the given group
 */
function getUsers(group) {
  let userList = [];
  let pageToken = '';

  do {
    // Fetch a page of memberships from the group
    const queryParams = {
      view: 'FULL',
      pageToken: pageToken
    }
    const listResponse = groups.Memberships.list(group.name, queryParams);

    // Filter non-users and keep member emails
    const users = listResponse.memberships
      .filter(membership => membership.type == 'USER')
      .map(membership => membership.preferredMemberKey.id);
    userList = userList.concat(users);

    // Prepare next page
    pageToken = listResponse.nextPageToken;
  } while (pageToken);

  return userList;
}

hasGroup และ hasUser

ทั้งบริการกลุ่ม hasGroup และ hasUser จะยืนยันว่าเอนทิตีเป็นสมาชิกของกลุ่มที่กำหนดหรือไม่ เนื่องจากทั้งกลุ่ม และผู้ใช้สามารถแสดงด้วยอีเมลได้ จึงใช้วิธีต่อไปนี้เพื่อยืนยันว่าทั้ง 2 อย่างเป็นของกลุ่มที่กำหนดหรือไม่

/**
 * Tests if the given email has an associated direct member to the given group.
 *
 * @param {Group} group: Group resource to which the entity is being checked as
 * a member
 * @param {String} email: Email that can represent a Group or User entity
 * @return {Boolean} isMember: Whether the entity is a direct member to the
 * group or not
 */
function checkDirectGroupMembership(group, email) {
  try {
    groups.Memberships.lookup(group.name, {'memberKey.id': email});

  } catch(e) {
    // Log failure if exception is not related to membership existence
    if (!e.message.includes('Membership does not exist.')) {
      console.error(e);
    }
    return false;
  }
  return true;
}